IT-Swarm.Net

بند JPQL IN: صفائف Java (أو قوائم ، مجموعات ...)؟

أرغب في تحميل جميع الكائنات التي تحتوي على علامة نصية لتعيين أي عدد صغير ولكن عشوائي من القيم من قاعدة البيانات الخاصة بنا. ستكون الطريقة المنطقية للقيام بذلك في SQL هي إنشاء جملة "IN". يسمح JPQL لـ IN ، ولكن يبدو أنه يطلب مني تحديد كل معلمة مفردة لـ IN مباشرة (كما في ، "في (: in1 ،: in2 ،: in3)").

هل هناك طريقة ما لتحديد صفيف ، أو قائمة (أو بعض الحاوية الأخرى) التي يجب أن يتم انتزاعها إلى قيم جملة IN؟

100
Bernd Haug

لست متأكدًا من JPA 1.0 ولكن يمكنك تمرير Collection في JPA 2.0:

String qlString = "select item from Item item where item.name IN :names"; 
Query q = em.createQuery(qlString, Item.class);

List<String> names = Arrays.asList("foo", "bar");

q.setParameter("names", names);
List<Item> actual = q.getResultList();

assertNotNull(actual);
assertEquals(2, actual.size());

اختبار مع EclipseLInk. باستخدام Hibernate 3.5.1 ، ستحتاج إلى تطويق المعلمة بالأقواس:

String qlString = "select item from Item item where item.name IN (:names)";

ولكن هذا خطأ ، استعلام JPQL في العينة السابقة صالح JPQL. انظر HHH-5126 .

192
Pascal Thivent

الحد Oracle هو 1000 معلمة. تم حل المشكلة عن طريق وضع السبات في الإصدار 4.1.7 على الرغم من تقسيم قائمة المعلمات التي تم تمريرها في مجموعات من 500 راجع JIRA HHH-1123

4
Ashish Thukral