IT TIP

HQL 또는 Java Persistence Query Language의 IN 절

itqueen 2020. 10. 20. 19:02
반응형

HQL 또는 Java Persistence Query Language의 IN 절


다음과 같은 매개 변수화 된 JPA 또는 Hibernate 쿼리가 있습니다.

SELECT entity FROM Entity entity WHERE name IN (?)

매개 변수를 ArrayList <String>으로 전달하고 싶습니다. 가능합니까? Hibernate Current는

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"}); 내 문제를 해결

참고 URL : https://stackoverflow.com/questions/4828049/in-clause-in-hql-or-java-persistence-query-language

반응형