سؤال

هل هناك أي طريقة لتحديد المعلمات الاختيارية (مثل عندما يتم توفير معلمات البحث من نموذج وليس جميع المعلمات مطلوبة) في استعلام مسمى عند الاستخدام بيات شتوىب أنا أستخدم أصلي مقدم SQL. الاستعلام، ولكن السؤال هو ربما ينطبق على اسمه مقر الاستعلامات كذلك.

أنا متأكد من أن الإجابة على هذا هو "لا"، لكنني لم أجد الإجابة النهائية في الوثائق بعد.

هل كانت مفيدة؟

المحلول

AFAIK، لا يوجد شيء من هذا القبيل حتى يتعين عليك كتابة استعلام ديناميكي لهذا. ربما إلقاء نظرة على هذا الإجابة السابقة إظهار كيفية القيام بذلك في HQL (التي يمكنك عن طريقها إلى SQL) وأيضا إظهار كيفية قيام معايير API بجعلها أكثر بساطة، وبالتالي فهي مناسبة لتحقيق هذه الوظيفة في رأيي.

تحديث: (الرد على تعليق من البروتوكول الاختياري) العمل مع قاعدة بيانات إرث يمكن أن يكون صعبا بالفعل مع السبات. ربما يمكنك استخدام الاستعلام الأصلي الديناميكي والعودة الكيانات غير المدارة رغم ذلك. ولكن على المدى الطويل، قد تزداد الأمور أسوأ (لا أستطيع أن أقول ذلك لك). ربما لا يكون السبات هو الخيار الأفضل في قضيتك وشيء ما مثل Ibatis يمنحك المرونة التي تحتاجها.

نصائح أخرى

كما ذكر في إجابة مختلفة إلى سؤال تمت الإشارة إليه سابقا، يعمل بناء HQL التالي بالنسبة لي:

select o from Product o WHERE :value is null or o.category = :value

لو :value يتم تمريرها null, ، يتم إرجاع جميع المنتجات.

أنظر أيضا معلمات اختيارية أو فارغة

لاحظ أن هذا لن يعمل في بعض إصدارات Sybase بسبب هذا الخطأ, ، وبالتالي فإن ما يلي هو بديل:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value

لسوء الحظ، لا يعمل الحل تحت "المعلمات اختيارية أو فارغة" في القوائم. اضطررت إلى تغيير الاستعلام كما يتبع ...

تعريف الاستعلام المسمى:

select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))

شفرة:

Set<KiHandlingTypeEnum> inHandlingTypes = ...

Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);

List<KiLogicalStock> stocks = query.getResultList();

الكثير من المرح العمل.

حل آخر للتعامل مع معلمات القائمة الاختيارية هو التحقق من فارغ باستخدام الاهتمام وظيفة. coalesce هو بدعم من السبات إرجاع أول معلمة غير فارغة من قائمة، مما يتيح لك التحقق من فارغة في قائمة دون كسر بناء الجملة عندما تكون هناك عناصر متعددة في القائمة.

مثال HQL مع المعلمة الاختيارية وقائمة المعلمة:

select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
  and ( :parameter is null or obj.field2 = :parameter )

هذا يعمل بالنسبة لي مع لهجة خادم SQL.

بالنسبة لأولئك الذين لديهم مشكلات ذات قيم فارغة، فإن خيار آخر هو استخدام قيمة بديلة. في حالتي، استخدمت القيم الإيجابية فقط لحقل الفئة الخاصة بي، والتي تسمح لي باستخدام قيمة بديلة = -1.

لذلك، قبل تنفيذ الاستعلام، يمكنك التحقق من صحة صغيرة:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top