125 votes

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

J'aimerais charger tous les objets dont la balise textuelle est définie par l'une des valeurs d'un nombre restreint mais arbitraire de notre base de données. La façon logique de procéder en SQL serait de construire une clause "IN". JPQL permet l'utilisation de IN, mais il semble que je doive spécifier chaque paramètre de IN directement (comme dans "in (:in1, :in2, :in3)").

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

232voto

Pascal Thivent Points 295221

Je ne suis pas sûr pour JPA 1.0 mais vous pouvez passer un fichier 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 devrez entourer le paramètre de parenthèses :

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

Mais il s'agit d'un bug, la requête JPQL dans l'échantillon précédent est un JPQL valide. Voir HHH-5126 .

5 votes

Y a-t-il un nombre maximum de noms à utiliser dans la "clause in" ?

3 votes

Le bogue susmentionné dans Hibernate semble avoir été corrigé dans la version 3.6.1.

1 votes

@pringlesinn Le nombre de valeurs dans une clause IN dépend de votre SGBD.

3voto

Ashish Thukral Points 593

La limite de l'oracle est de 1000 paramètres. Le problème a été résolu par hibernate dans la version 4.1.7, mais en divisant la liste des paramètres passés en groupes de 500. voir JIRA HHH-1123

2 votes

Malheureusement, ce problème n'a pas été résolu. Le ticket a été marqué comme résolu, mais le problème (comme le montrent les commentaires) n'a pas été corrigé par l'équipe Hibernate.

0 votes

@Druckles um où ? Je ne vois pas de commentaires antérieurs à 2016. Et ce n'étaient que deux commentaires qui ne disent pratiquement rien d'autre que les habituels "help plz!!!11 !!!!" d'internet. Vous n'avez donné aucune raison de faire confiance au rapport de bug comme étant résolu.

0 votes

@searchengine27 J'ai dit que le rapport était no résolu, bien qu'il soit marqué comme résolu. La résolution était, comme rapporté par Steve Ebersole : "La résolution de ce problème est que nous allons simplement avertir les utilisateurs via la journalisation lorsque cette condition est détectée." Les commentaires de Noel Trout en 2012 expliquent pourquoi cela n'est pas suffisant.

2voto

Vahan Yeghyan Points 239

J'ai eu un problème avec ce type de sql, je donnais une liste vide dans la clause IN (toujours vérifier la liste si elle n'est pas vide). Peut-être que ma pratique aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X