2010-05-05 13 views
92

Me gustaría cargar todos los objetos que tienen un conjunto de etiquetas de texto a cualquiera de un número pequeño pero arbitrario de valores de nuestra base de datos. La forma lógica de hacerlo en SQL sería construir una cláusula "IN". JPQL permite IN, pero parece requerirme que especifique cada parámetro en IN directamente (como en, "in (: in1,: in2,: in3)").Cláusula JPQL IN: matrices Java (o listas, conjuntos ...)?

¿Hay alguna manera de especificar una matriz, o una lista (u otro contenedor) que deba desenrollarse a los valores de una cláusula IN?

Respuesta

167

no estoy seguro de JPA 1.0, pero se puede pasar una Collection en 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()); 

probado con EclipseLink. Con Hibernate 3.5.1, tendrá que rodear el parámetro con paréntesis:

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

pero esto es un error, la consulta JPQL en la muestra anterior es válida JPQL. Ver HHH-5126.

+5

¿hay un número máximo de nombres para usar en "cláusula in"? – pringlesinn

+3

El error mencionado anteriormente en Hibernate parece corregido en la versión 3.6.1 –

+0

@pringlesinn el número de valores en una cláusula IN depende de su DBMS –

4

El límite de oráculo es de 1000 parámetros. El problema ha sido resuelto por hibernación en la versión 4.1.7 aunque al dividir la lista de parámetros pasados ​​en conjuntos de 500 see JIRA HHH-1123