2011-01-28 19 views
64

Tengo el siguiente definido en los parámetros de la APP, o Hibernate, consulta:EN-cláusula en HQL o Java Persistence Query Language

SELECT entity FROM Entity entity WHERE name IN (?) 

Quiero pasar el parámetro como un ArrayList < String>, es esto posible? La corriente de Hibernate me dice que

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String 

¿Es esto posible en absoluto?

RESPUESTA: Colecciones como parámetros sólo funcionan con parámetros con nombre como ":name", no con parámetros de estilo JDBC como "?".

+1

¿Le importaría agregar su respuesta a esta pregunta? Sé que es antiguo, pero la auto-respuesta a su pregunta no solo está permitida, sino que se alienta explícitamente. – Makoto

Respuesta

123

¿Está utilizando Query objeto de Hibernate o JPA? Para la APP, que debería funcionar bien:

String jpql = "from A where name in (:names)"; 
Query q = em.createQuery(jpql); 
q.setParameter("names", l); 

para Hibernate, tendrá que utilizar el setParameterList:

String hql = "from A where name in (:names)"; 
Query q = s.createQuery(hql); 
q.setParameterList("names", l); 
+0

Okey, el problema era el uso? para designar los parámetros. Con parámetros nombrados como: peter esto funciona. – Daniel

+0

por lo que no necesita las comillas para cada cadena en la lista? – CCC

+0

Cómo configurar String [] array como parámetro de consulta – priyadarshini

18

en HQL puede usar el parámetro de consulta y establecer la recopilación con el método setParameterList.

Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)"); 
    q.setParameterList("names", names); 
3

Usando pura JPA con Hibernate 5.0.2.Final como el proveedor real la siguiente parece funcionar con parámetros de posición así:

Entity.java:

@Entity 
@NamedQueries({ 
    @NamedQuery(name = "byAttributes", query = "select e from Entity e where e.attribute in (?1)") }) 
public class Entity { 
    @Column(name = "attribute") 
    private String attribute; 
} 

Dao.java:

public class Dao { 
    public List<Entity> findByAttributes(Set<String> attributes) { 
     Query query = em.createNamedQuery("byAttributes"); 
     query.setParameter(1, attributes); 

     List<Entity> entities = query.getResultList(); 
     return entities; 
    } 
} 
3

Dejando de lado el paréntesis y simplemente llamando 'setParameter' ahora trabaja con al menos Hibernate.

String jpql = "from A where name in :names"; 
Query q = em.createQuery(jpql); 
q.setParameter("names", l); 
Cuestiones relacionadas