JPQL IN yan tümcesi: Java-Arrays (veya Listeler, Kümeler…)?


108

Veritabanımızdaki küçük ama rastgele sayıdaki değerlerden herhangi birine ayarlanmış bir metin etiketine sahip tüm nesneleri yüklemek istiyorum. SQL'de bunu yapmanın mantıklı yolu bir "IN" cümlesi oluşturmaktır. JPQL IN'e izin verir, ancak her bir parametreyi doğrudan IN olarak belirlememi gerektiriyor gibi görünüyor ("in (: in1,: in2,: in3)" içinde olduğu gibi).

Bir IN yan tümcesinin değerlerine kaydırılması gereken bir dizi veya bir liste (veya başka bir kap) belirtmenin bir yolu var mı?

Yanıtlar:


208

JPA 1.0'dan emin değilim, ancak CollectionJPA 2.0'da bir geçebilirsiniz :

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 ile test edilmiştir. Hazırda Bekletme 3.5.1 ile parametreyi parantez içine almanız gerekir:

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

Ancak bu bir hatadır, önceki örnekteki JPQL sorgusu geçerli JPQL'dir. HHH-5126'ya bakınız .


5
"in cümlesinde" kullanılacak maksimum ad sayısı var mı?
Gondim

3
Hibernate'de
bahsedilen

1
@pringlesinn bir IN-cümlesindeki değerlerin sayısı DBMS'nize bağlıdır
Tim Büthe

JPA 1.0'da çalışıyor (ve parantezle çevrelenmesi zorunlu değil, ancak okunabilirlik için yapmalısınız)
Javier Larios

peki => item.name in (like: names)
dzgeek

3

Oracle sınırı 1000 parametredir. Sorun, 4.1.7 sürümünde hazırda bekletme ile çözülmüştür, ancak geçirilen parametre listesini 500'lü setlere ayırarak bkz. JIRA HHH-1123


1
Maalesef bu çözülmedi. Bilet çözüldü olarak işaretlendi, ancak sorun (yorumlarda gösterildiği gibi) Hazırda Beklet ekibi tarafından düzeltilmedi.
Druckles

@Druckles um nerede? 2016'dan daha eski bir yorum göremiyorum. Ve bunlar, her zamanki internet 'help plz !!! 11 !!!!' dışında neredeyse hiçbir şey söylemeyen sadece iki yorumdu. Hata raporuna çözüldüğüne güvenmek için hiçbir neden belirtmediniz.
searchengine27

@ searchengine27 ben rapor olduğunu söyledi değil çözüldü olarak işaretlenir rağmen, çözüldü. Çözüm, Steve Ebersole tarafından bildirildiği üzere şöyleydi: "Bunun çözümü, bu durum tespit edildiğinde günlük kaydı yoluyla kullanıcıları uyaracağız." Noel Trout'un 2012'de yaptığı yorumlar, bunun neden yeterli olmadığını açıklıyor.
Druckles

Başka bir deyişle, bu cevap yanlış veya en iyi ihtimalle yanıltıcıdır.
Druckles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.