HQL 또는 Java Persistence Query Language의 IN 절 매개 변수화 된 JPA

다음과 같은 매개 변수화 된 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”}); 내 문제를 해결