IN-cláusula en HQL o Java Persistence Query Language

78

Tengo la siguiente consulta JPA parametrizada, o Hibernate:

SELECT entity FROM Entity entity WHERE name IN (?)

Quiero pasar el parámetro como ArrayList <String>, ¿es posible? La corriente de hibernación me dice que

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

¿Es esto posible en absoluto?

RESPUESTA : Las colecciones como parámetros solo funcionan con parámetros con nombre como " :name", no con parámetros de estilo JDBC como " ?".

Daniel
fuente
2
¿Le importaría agregar su respuesta a esta pregunta? Sé que es antiguo, pero responder tú mismo a tu pregunta no solo está permitido, sino que se recomienda explícitamente.
Makoto

Respuestas:

157

¿Está utilizando el Queryobjeto de Hibernate o JPA? Para JPA, debería funcionar bien:

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

Para Hibernate, necesitará usar setParameterList:

String hql = "from A where name in (:names)";
Query q = s.createQuery(hql);
q.setParameterList("names", l);
jpkrohling
fuente
Okey, ¿el problema estaba usando? para designar los parámetros. Con parámetros con nombre como: peter esto funciona.
Daniel
¿Entonces no necesita las comillas para cada cadena en la lista?
CCC
Cómo establecer Array cadena [] como consulta de parámetros
Priyadarshini
1
podría convertirlo en una lista:List<String> list = Arrays.asList(yourArray);
MarkyDD
1
IMP: se requieren paréntesis para versiones anteriores de hibernate. Las versiones más nuevas no admitirán (), al menos en mi caso. Además, vea esta solución stackoverflow.com/a/21341663/6043669
HopeKing
24

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

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

Omitir el paréntesis y simplemente llamar a 'setParameter' ahora funciona con al menos Hibernate.

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

Usando JPA puro con Hibernate 5.0.2.Final como proveedor real, lo siguiente parece funcionar también con parámetros posicionales:

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;
    }
}
Atila T
fuente
0

query.setParameterList ("nombre", nueva cadena [] {"Ron", "Som", "Roxi"}); solucionó mi problema

Shahid Hussain Abbasi
fuente