Cláusula IN en lenguaje de consulta de persistencia HQL o Java

Tengo la siguiente consulta parametrizada de JPA o Hibernate:

SELECT entity FROM Entity entity WHERE name IN (?) 

Quiero pasar el parámetro como ArrayList , ¿es esto posible? La stream de Hibernate me dice que

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

¿Es esto posible?

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

¿Estás utilizando el objeto Query 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ás usar setParameterList:

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

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

Dejar el paréntesis y simplemente llamar a ‘setParameter’ ahora funciona al menos con Hibernate.

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

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 findByAttributes(Set attributes) { Query query = em.createNamedQuery("byAttributes"); query.setParameter(1, attributes); List entities = query.getResultList(); return entities; } }