2010-05-05 5 views
92

Je voudrais charger tous les objets qui ont un ensemble de balises textuelles à un nombre restreint mais arbitraire de valeurs de notre base de données. La façon logique de faire cela en SQL serait de construire une clause "IN". JPQL autorise IN, mais il semble que je doive spécifier chaque paramètre à IN directement (comme dans, "in (: in1,: in2,: in3)").Clause JPQL IN: Java-Arrays (ou Listes, Ensembles ...)?

Existe-t-il un moyen de spécifier un tableau, ou une liste (ou tout autre conteneur) qui devrait être déroulée aux valeurs d'une clause IN?

Répondre

167

Je ne suis pas sûr pour JPA 1.0, mais vous pouvez passer un 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()); 

testé avec EclipseLink. Avec Hibernate 3.5.1, vous devez entourer le paramètre entre parenthèses:

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

Mais ceci est un bug, la requête JPQL dans l'exemple précédent est valide JPQL. Voir HHH-5126.

+5

y a-t-il un nombre maximum de noms à utiliser dans "in clause"? – pringlesinn

+3

Le bogue susmentionné dans Hibernate semble être corrigé dans la version 3.6.1 –

+0

@pringlesinn le nombre de valeurs dans une clause IN dépend de votre SGBD –

4

La limite d'oracle est de 1000 paramètres. Le problème a été résolu par hibernate dans la version 4.1.7 bien qu'en divisant la liste des paramètres passés en ensembles de 500 see JIRA HHH-1123