ประโยค JPQL IN: Java-Arrays (หรือ Lists, Sets ... )?


108

ฉันต้องการโหลดอ็อบเจ็กต์ทั้งหมดที่มีแท็กข้อความที่ตั้งค่าเป็นค่าใด ๆ จำนวนเล็กน้อย แต่โดยพลการจากฐานข้อมูลของเรา วิธีเชิงตรรกะในการดำเนินการนี้ใน SQL คือการสร้างอนุประโยค "IN" JPQL อนุญาตให้ใช้ IN แต่ดูเหมือนว่าต้องการให้ฉันระบุทุกพารามิเตอร์เป็น IN โดยตรง (เช่นใน "in (: in1,: in2,: in3)")

มีวิธีบางอย่างในการระบุอาร์เรย์หรือรายการ (หรือคอนเทนเนอร์อื่น ๆ ) ที่ควรยกเลิกการควบคุมค่าของประโยค IN หรือไม่?

คำตอบ:


208

ฉันไม่แน่ใจสำหรับ JPA 1.0 แต่คุณสามารถส่งเป็นCollectionJPA 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


5
มีจำนวนชื่อสูงสุดที่จะใช้ใน "in clause" หรือไม่?
Gondim

3
ข้อผิดพลาดข้างต้นใน Hibernate ดูเหมือนจะได้รับการแก้ไขแล้วในเวอร์ชัน 3.6.1
Denis Kniazhev

1
@pringlesinn จำนวนค่าใน IN-clause ขึ้นอยู่กับ DBMS ของคุณ
Tim Büthe

ทำงานใน JPA 1.0 (และไม่มีการบังคับล้อมรอบด้วยวงเล็บ แต่คุณควรอ่านเพื่อความสะดวก)
Javier Larios

จะเกิดอะไรขึ้นถ้าคุณต้องการ => item.name ใน (like: names)
dzgeek

3

ขีด จำกัด oracle คือ 1,000 พารามิเตอร์ ปัญหาได้รับการแก้ไขโดยการจำศีลในเวอร์ชัน 4.1.7 แม้ว่าโดยการแยกรายการพารามิเตอร์ที่ส่งผ่านออกเป็นชุด 500 โปรดดู JIRA HHH-1123


1
ขออภัยยังไม่ได้รับการแก้ไข ตั๋วถูกทำเครื่องหมายว่าแก้ไขแล้ว แต่ปัญหา (ตามที่แสดงในความคิดเห็น) ไม่ได้รับการแก้ไขโดยทีมงาน Hibernate
Druckles

@Druckles อืมที่ไหน ฉันไม่เห็นความคิดเห็นใด ๆ ที่เก่ากว่าปี 2016 และนั่นเป็นเพียงสองความคิดเห็นที่บอกว่าไม่มีอะไรอื่นนอกจากอินเทอร์เน็ตทั่วไป 'ช่วยด้วย !!! 11 !!!!' คุณไม่ได้ให้เหตุผลที่จะเชื่อถือรายงานข้อบกพร่องว่าได้รับการแก้ไขแล้ว
Searchengine27

@ Searchengine27 ฉันบอกว่ารายงานไม่ได้รับการแก้ไขแม้ว่าจะถูกทำเครื่องหมายว่าแก้ไขแล้วก็ตาม ความละเอียดเป็นไปตามรายงานของ Steve Ebersole: "วิธีแก้ปัญหานี้คือเราจะเตือนผู้ใช้ผ่านการบันทึกเมื่อตรวจพบเงื่อนไขนี้" ความคิดเห็นของ Noel Trout ย้อนกลับไปในปี 2555 ขยายความว่าเหตุใดจึงไม่เพียงพอ
Druckles

กล่าวอีกนัยหนึ่งคำตอบนี้ผิดหรืออย่างที่ดีที่สุดคือทำให้เข้าใจผิด
Druckles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.