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 " ?
".
Respuestas:
¿Está utilizando el
Query
objeto 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);
fuente
List<String> list = Arrays.asList(yourArray);
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);
fuente
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);
fuente
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; } }
fuente
query.setParameterList ("nombre", nueva cadena [] {"Ron", "Som", "Roxi"}); solucionó mi problema
fuente