clause JPQL IN: Java-réseaux (ou listes, ensembles ...)?
-
03-10-2019 - |
Question
Je voudrais charger tous les objets qui ont un jeu d'étiquette textuelle à tout d'un petit nombre, mais arbitraire des valeurs de notre base de données. La façon logique d'aller à ce sujet dans SQL serait de construire une clause « IN ». JPQL permet, mais il me semble exiger de spécifier chaque paramètre à IN directement (comme dans "dans (: in1,: IN2,: in3)").
Est-il possible de spécifier un tableau ou une liste (ou un autre récipient) qui devrait déroulable aux valeurs d'une clause IN?
La solution
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 .
Autres conseils
La limite d'Oracle est de 1000 paramètres. Le problème a été résolu par mise en veille prolongée dans la version 4.1.7 bien en divisant la liste des paramètres passés dans des ensembles de 500 voir JIRA HHH-1123