Pregunta

Me gustaría cargar todos los objetos que tienen un conjunto de etiquetas de texto a cualquiera de una pequeña pero arbitrario número de valores de nuestra base de datos. La forma lógica de hacer esto en SQL sería construir una cláusula de "IN". JPQL permite, pero me parece requerir para especificar cada parámetro concreto a IN directamente (como en, "en (: in1,: IN2,: IN3)").

¿Hay alguna manera de especificar una matriz o una lista (o algún otro recipiente) que deben ser desenrollado a los valores de una cláusula IN?

¿Fue útil?

Solución

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 .

Otros consejos

El límite oráculo es de 1000 parámetros. El problema se ha resuelto mediante hibernación en la versión 4.1.7 aunque dividiendo la lista de parámetros aprobada en series de 500 ver JIRA HHH-1123

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top