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 " ?".

Daniel
quelle
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);
jpkrohling
quelle
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);
michal.kreuzman
quelle
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);
Steven Spungin
quelle
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;
    }
}
Attila T.
quelle
0

query.setParameterList ("name", neuer String [] {"Ron", "Som", "Roxi"}); mein Problem behoben

Shahid Hussain Abbasi
quelle