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