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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top