IN-Klausel in HQL oder Java Persistence Query Language


78

Ich habe die folgende parametrisierte JPA- oder Hibernate-Abfrage:

SELECT entity FROM Entity entity WHERE name IN (?)

Ich möchte den Parameter als ArrayList <String> übergeben. Ist dies möglich? Der Ruhezustand sagt mir, dass

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

Ist das überhaupt möglich?

ANTWORTEN : Sammlungen als Parameter funktionieren nur mit benannten Parametern wie " :name", nicht mit JDBC-Stilparametern wie " ?".


2
Würde es Ihnen etwas ausmachen, Ihre Antwort auf diese Frage hinzuzufügen? Ich weiß, dass es eine alte ist, aber die Selbstantwort auf Ihre Frage ist nicht nur erlaubt, sondern wird ausdrücklich empfohlen.
Makoto

Antworten:


155

Verwenden Sie das QueryObjekt von Hibernate oder JPA? Für JPA sollte es gut funktionieren:

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

Für den Ruhezustand müssen Sie die setParameterList verwenden:

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

Okey, das Problem war? die Parameter zu bezeichnen. Mit benannten Parametern wie: Peter funktioniert dies.
Daniel

Sie brauchen also nicht die Anführungszeichen für jede Zeichenfolge in der Liste?
CCC

Wie man String [] Array als Abfrageparameter setzt
priyadarshini

1
Sie könnten es in eine Liste konvertieren:List<String> list = Arrays.asList(yourArray);
MarkyDD

1
IMP: Für ältere Versionen des Ruhezustands sind Klammern erforderlich. Neuere Versionen unterstützen () nicht - zumindest in meinem Fall. Siehe auch diese Lösung stackoverflow.com/a/21341663/6043669
HopeKing

23

In HQL können Sie Abfrageparameter verwenden und Collection mit der Methode setParameterList festlegen.

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

5

Das Weglassen der Klammern und das einfache Aufrufen von 'setParameter' funktioniert jetzt mindestens mit Hibernate.

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

3

Verwenden von reinem JPA mit Hibernate 5.0.2.Final als eigentlichem Anbieter scheint Folgendes auch mit Positionsparametern zu funktionieren:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.