Tengo el siguiente parametrizada JPA o Hibernate, consulta:

SELECT entity FROM Entity entity WHERE name IN (?)

Quiero pasar el parámetro como un ArrayList<Cadena> ¿es esto posible? Hibernate actual me dice, que

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

Es esto posible en todos los?

RESPUESTA: Colecciones como parámetros de trabajar sólo con los parámetros con nombre como «:name«, no con JDBC de los parámetros del estilo como «?«.

  • ¿Te importaría añadir tu respuesta a esta pregunta? Sé que es un viejo, pero la auto-responder a tu pregunta es no sólo está permitido, se fomenta explícitamente.
InformationsquelleAutor Daniel | 2011-01-28

4 Comentarios

  1. 145

    Estás usando Hibernate Query objeto, 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, usted necesitará utilizar el 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 el nombre de parámetros como :peter funciona esto.
    • así que usted no necesita las cotizaciones para cada cadena en la lista?
    • Cómo establecer String[] matriz como parámetro de consulta
    • usted puede convertir a una lista: List<String> list = Arrays.asList(yourArray);
    • IMP: los Paréntesis son necesarios para las versiones anteriores de hibernación. Las versiones más recientes no apoyan a los () – al menos en mi caso. También ver esta solución stackoverflow.com/a/21341663/6043669
  2. 20

    en HQL puede utilizar el parámetro de consulta y Colección con setParameterList método.

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

    Deja fuera de los paréntesis y simplemente llamando ‘setParameter’ ahora trabaja con al menos un estado de Hibernación.

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

    Puras de la JPA con Hibernate 5.0.2.Final como el proveedor real de la siguiente parece funcionar con los 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;
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here