JPQL IN klausa: Java-Array (atau Daftar, Set…)?


108

Saya ingin memuat semua objek yang memiliki tag tekstual yang disetel ke salah satu dari sejumlah kecil nilai tapi sewenang-wenang dari database kami. Cara logis untuk melakukannya dalam SQL adalah dengan membangun klausa "IN". JPQL memungkinkan untuk IN, tetapi tampaknya mengharuskan saya menentukan setiap parameter ke IN secara langsung (seperti, "in (: in1,: in2,: in3)").

Adakah cara untuk menentukan larik, atau daftar (atau wadah lain) yang harus dibuka gulungannya ke nilai klausa IN?

Jawaban:


208

Saya tidak yakin untuk JPA 1.0 tetapi Anda dapat lulus Collectiondi 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());

Diuji dengan EclipseLInk. Dengan Hibernate 3.5.1, Anda harus mengapit parameter dengan tanda kurung:

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

Namun ini adalah bug, kueri JPQL dalam sampel sebelumnya adalah JPQL yang valid. Lihat HHH-5126 .


5
apakah ada jumlah maksimal nama untuk digunakan dalam "dalam klausa"?
Gondim

3
Bug yang disebutkan di Hibernate tampaknya telah diperbaiki dalam versi 3.6.1
Denis Kniazhev

1
@pringlesinn jumlah nilai dalam klausa IN tergantung pada DBMS Anda
Tim Büthe

bekerja di JPA 1.0 (dan tidak ada surround wajib dengan tanda kurung, tetapi untuk keterbacaan Anda harus)
Javier Larios

bagaimana jika Anda ingin => item.name di (seperti: nama)
dzgeek

3

Batas oracle adalah 1000 parameter. Masalah telah diselesaikan dengan hibernate di versi 4.1.7 meskipun dengan memisahkan daftar parameter yang dilewatkan dalam set 500, lihat JIRA HHH-1123


1
Sayangnya ini tidak terselesaikan. Tiket ditandai sebagai terselesaikan, tetapi masalah (seperti yang ditunjukkan oleh komentar) tidak diperbaiki oleh tim Hibernate.
Druckles

@Druckles um dimana? Saya tidak melihat ada komentar yang lebih lama dari 2016. Dan itu hanya dua komentar yang secara praktis tidak mengatakan apa-apa selain internet biasa 'tolong tolong !!! 11 !!!!'. Anda tidak memberikan alasan untuk mempercayai laporan bug yang telah diselesaikan.
searchengine27

@ searchengine27 Saya mengatakan laporan itu tidak terselesaikan, meskipun sudah ditandai sebagai terselesaikan. Resolusi itu, seperti yang dilaporkan oleh Steve Ebersole: "Resolusi untuk ini adalah kami hanya akan memperingatkan pengguna melalui logging saat kondisi ini terdeteksi." Komentar Noel Trout di tahun 2012 memperluas mengapa ini tidak cukup.
Druckles

Dengan kata lain, jawaban ini salah atau, paling banter, menyesatkan.
Druckles
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.