JPA 쿼리에 IN 절 목록 추가


125

다음과 같은 NamedQuery를 만들었습니다.

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")

내가 원하는 것은 하나의 항목 대신 항목 목록으로 매개 변수 : inclList를 채우는 것입니다. 예를 들어 new List<String>() { "a", "b", "c" }: inclList 매개 변수에서 어떻게 얻을 수 있습니까? 하나의 문자열 만 코드화 할 수 있습니다. 예를 들면 :

setParameter("inclList", "a") // works

setParameter("inclList", "a, b") // does not work

setParameter("inclList", "'a', 'b'") // does not work

setParameter("inclList", list) // throws an exception

문자열을 작성하고 그로부터 전체 쿼리를 작성할 수 있다는 것을 알고 있지만 오버 헤드를 피하고 싶었습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

관련 질문 : 목록이 매우 큰 경우 이와 같은 쿼리를 작성하는 좋은 방법이 있습니까?


이것은 stackoverflow.com/questions/1557085/… 의 복제본 이지만이 스레드는 유용한 답변을 제공합니다.
Mike Ryan

답변:


181

IN컬렉션 값 매개 변수와 함께 사용할 때는 다음이 필요하지 않습니다 (...).

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 

6
아니 ... 나는 그 반대입니다. : inclList를 사용하면 작동하지 않습니다. IN (: inclList)를 사용하면 작동합니다.
Gunjan Shah

1
또한 언급 : 매개 변수의 유형은 객체의 컬렉션 (배열이 아님)이어야합니다. 개체는 필드 유형과 일치해야합니다. .toString ()은 String 클래스를 대체하지 않습니다
dube

2
나는 이것이 Hibernate 버전에서 변경된 것이라고 생각한다. 내가 기억할 수있는 한 IN을 사용할 때 변수 주위에 paranthesis가 없을 때 오류가 발생했다. 이상한 그것은 .. 호환이 아니라면
Tobb

1
이것은 실제로 3.6.1에서 수정 된 최대 절전 모드 버그 (괄호 필요)였습니다.
Mat

1
관련 질문 : 매우 큰 목록의 경우 구현에 제한이있을 수 있습니다. 예 : 오라클 11g. 최대 1000 개의 목록 요소를 매개 변수로 사용할 수 있습니다. 해결 방법은 하위 목록에서 목록을 자르고 결과를 수집하는 것입니다. JPA 자체는 목록 크기를 제한하지 않습니다.
Mahttias Schrebiér 2016 년

81

적절한 JPA 쿼리 형식은 다음과 같습니다.

el.name IN :inclList

공급자로 이전 버전의 Hibernate를 사용하고 있다면 다음과 같이 작성해야합니다.

el.name IN (:inclList)

그러나 그것은 버그입니다 ( HHH-5126 ) (편집 : 지금까지 해결되었습니다).


5
최대 절전 모드 사용 ()의 이전 버전을 구분 해 주셔서 감사합니다
롭 L

31
public List<DealInfo> getDealInfos(List<String> dealIds) {
        String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
        TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
        query.setParameter("inclList", dealIds);
        return query.getResultList();
    }

JPA 2, Jboss 7.0.2와 함께 작동합니다.


9

List아래와 같이 변환해야합니다 .

    String[] valores = hierarquia.split(".");       
    List<String> lista =  Arrays.asList(valores);

    String jpqlQuery = "SELECT a " +
            "FROM AcessoScr a " +
            "WHERE a.scr IN :param ";

    Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);                   
    query.setParameter("param", lista);     
    List<AcessoScr> acessos = query.getResultList();

Thx이 답변이 나를 도왔습니다
cabaji99 dec. 01 dec. 01 172017-12-01
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.