Domanda

vorrei caricare tutti gli oggetti che hanno un tag set testuali a qualsiasi di un piccolo ma arbitrario numero di valori dal nostro database. Il modo più logico per andare su questo in SQL sarebbe quello di costruire una clausola "IN". JPQL consente IN, ma sembra richiedere mi specificare ogni singolo parametro IN direttamente (come in "in (: in1,: in2,: in3)").

C'è qualche modo per specificare una matrice, o un elenco (o qualche altro contenitore) che dovrebbe essere srotolato ai valori di una proposizione IN?

È stato utile?

Soluzione

Non sono sicuro per JPA 1.0, ma è possibile passare un Collection in 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());

Testato con EclipseLink. Con Hibernate 3.5.1, è necessario circondare il parametro con parentesi:

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

Ma questo è un bug, la query JPQL nell'esempio precedente è JPQL valido. Vedere HHH-5126 .

Altri suggerimenti

Il limite di Oracle è di 1000 parametri. Il problema è stato risolto da Hibernate nella versione 4.1.7, anche se dalla scissione della lista parametro passato in gruppi di 500   vedere JIRA HHH-1123

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top