[java] JPA 쿼리에 IN 절 목록 추가

다음과 같은 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

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

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



답변

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

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


답변

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

el.name IN :inclList

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

el.name IN (:inclList)

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


답변

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와 함께 작동합니다.


답변

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


답변