HQL 또는 Java Persistence Query Language의 IN 절


78

다음과 같은 매개 변수화 된 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 스타일 매개 변수가 아니라 " ?" 와 같은 명명 된 매개 변수에서만 작동 합니다.


2
이 질문에 대한 답변을 추가해 주시겠습니까? 나는 그것이 오래된 것임을 알고 있지만 귀하의 질문에 스스로 대답하는 것은 허용 될뿐만 아니라 명시 적으로 권장됩니다.
마코토

답변:


157

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);

좋아요, 문제는? 매개 변수를 지정합니다. : peter와 같은 명명 된 매개 변수를 사용하면 작동합니다.
Daniel

그래서 목록의 각 문자열에 따옴표가 필요하지 않습니까?
CCC

String [] 배열을 쿼리 매개 변수로 설정하는 방법
priyadarshini

1
당신은 목록에 변환 할 수 있습니다 :List<String> list = Arrays.asList(yourArray);
MarkyDD

1
IMP : 이전 버전의 최대 절전 모드에는 괄호가 필요합니다. 최신 버전은 ()를 지원하지 않습니다-적어도 제 경우에는. 또한이 솔루션을 참조하십시오. stackoverflow.com/a/21341663/6043669
HopeKing

24

HQL에서는 쿼리 매개 변수를 사용하고 setParameterList 메소드로 Collection을 설정할 수 있습니다.

    Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
    q.setParameterList("names", names);

5

괄호를 생략하고 단순히 'setParameter'를 호출하면 이제 최소한 Hibernate에서 작동합니다.

String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);

3

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;
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.