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 " ?
".
Antworten:
Verwenden Sie das
Query
Objekt 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);
quelle
List<String> list = Arrays.asList(yourArray);
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);
quelle
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);
quelle
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; } }
quelle
query.setParameterList ("name", neuer String [] {"Ron", "Som", "Roxi"}); mein Problem behoben
quelle