2009-05-06 22 views
11

Estamos tratando de generar dinámicamente una cláusula IN para que una consulta sql nativa devuelva una entidad JPA. Hibernate es nuestro proveedor de JPA. Nuestro código se ve algo como esto.Usando la cláusula IN en una consulta SQL nativa

@NamedQuery(
    name="fooQuery", 
    queryString="select f from Foo f where f.status in (?1)" 
) 

.... 

Query q = entityManager.createNamedQuery("fooQuery"); 
q.setParameter(1, "('NEW','OLD')"); 
return q.getResultList(); 

Esto no funciona, la cláusula in no reconoce ninguno de los valores pasados ​​de esta manera. ¿Alguien sabe de una solución a este problema?

+0

dónde está su consulta SQL nativo? –

Respuesta

15

APP respalda parámetros de la lista con nombre, en su caso:

@NamedQuery(
    name="fooQuery", 
    queryString="select f from Foo f where f.status in (?1)" 
) 

Query q = entityManager.createNamedQuery("fooQuery"); 

List<String> listParameter = new ArrayList<>(); 
listParameter.add("NEW"); 
listParameter.add("OLD"); 

q.setParameter(1, listParameter); 
return q.getResultList(); 
0

Recomendaría no usar un parámetro compuesto para su consulta, sino dividirlo individualmente. No especifique ('NEW','OLD'); especifique los parámetros por separado de 'NEW' y 'OLD'. Eso puede ayudar.

Esto, por supuesto, puede causar problemas si las longitudes de los parámetros no están definidas.

Cuestiones relacionadas