web-dev-qa-db-fra.com

Clause IN en HQL ou Java Langage de requête de persistance

J'ai la requête JPA ou Hibernate paramétrée suivante:

SELECT entity FROM Entity entity WHERE name IN (?)

Je souhaite passer le paramètre sous la forme d'une ArrayList <String>, est-ce possible? Courant Hibernate me dit que

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

Est-ce possible?

ANSWER : Les collections en tant que paramètres ne fonctionnent qu'avec des paramètres nommés tels que ":name ", pas avec les paramètres de style JDBC comme" ? ".

74
Daniel

Utilisez-vous l’objet Query d’Hibernate, ou JPA? Pour JPA, cela devrait fonctionner correctement:

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

Pour Hibernate, vous devrez utiliser setParameterList:

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

dans HQL, vous pouvez utiliser le paramètre de requête et définir Collection avec la méthode setParameterList.

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

Abandonner la parenthèse et simplement appeler 'setParameter' fonctionne maintenant avec au moins Hibernate.

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

Utilisation de JPA pur avec Hibernate 5.0.2.Final en tant que fournisseur actuel, les éléments suivants semblent également fonctionner avec les paramètres de position:

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;
    }
}
3
Attila T

query.setParameterList ("nom", nouveau String [] {"Ron", "Som", "Roxi"}); résolu mon problème

0