다음과 같은 매개 변수화 된 JPA 또는 Hibernate 쿼리가 있습니다.
SELECT entity FROM Entity entity WHERE name IN (?)
매개 변수를 ArrayList <String>으로 전달하고 싶습니다. 가능합니까? 최대 절전 전류는 나에게 말합니다.
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
이것이 가능합니까?
답변 : 매개 변수로서의 컬렉션은 ” :name
“와 같은 JDBC 스타일 매개 변수가 아니라 ” ?
” 와 같은 명명 된 매개 변수에서만 작동 합니다.
답변
Hibernate의 Query
객체 또는 JPA를 사용하고 있습니까? JPA의 경우 정상적으로 작동합니다.
String jpql = "from A where name in (:names)";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
Hibernate의 경우 setParameterList를 사용해야합니다.
String hql = "from A where name in (:names)";
Query q = s.createQuery(hql);
q.setParameterList("names", l);
답변
HQL에서는 쿼리 매개 변수를 사용하고 setParameterList 메소드로 Collection을 설정할 수 있습니다.
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
답변
괄호를 생략하고 단순히 ‘setParameter’를 호출하면 이제 최소한 Hibernate에서 작동합니다.
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
답변
Hibernate 5.0.2.Final 과 함께 순수 JPA를 실제 공급자로 사용하면 다음과 같은 위치 매개 변수에서도 작동하는 것 같습니다.
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;
}
}
답변
query.setParameterList ( “name”, new String [] { “Ron”, “Som”, “Roxi”}); 내 문제를 해결