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 " ?".


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);

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);

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);

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;
    }
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.