web-dev-qa-db-fra.com

Clause JPQL IN: Java-Arrays (ou Lists, Sets ...)?

Je voudrais charger tous les objets pour lesquels une balise textuelle est définie sur un nombre restreint mais arbitraire de valeurs de notre base de données. La façon logique de procéder à cela en SQL serait de construire une clause "IN". JPQL autorise IN, mais il semble que je doive spécifier chaque paramètre directement dans IN (comme dans, "in (: in1,: in2,: in3)").

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

99
Bernd Haug

Je ne suis pas sûr pour JPA 1.0 mais vous pouvez passer un Collection dans 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 de parenthèses:

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

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

191
Pascal Thivent

La limite Oracle est de 1000 paramètres. Le problème a été résolu par hibernate dans la version 4.1.7, mais en scindant la liste des paramètres passés en ensembles de 500 voir JIRA HHH-112

4
Ashish Thukral