JPQL IN 절 : Java-Arrays (또는 Lists, Sets…)?


108

우리 데이터베이스에서 작지만 임의의 값으로 설정된 텍스트 태그가있는 모든 개체를로드하고 싶습니다. SQL에서이 문제를 해결하는 논리적 방법은 "IN"절을 작성하는 것입니다. JPQL은 IN을 허용하지만 모든 단일 매개 변수를 IN에 직접 지정해야하는 것 같습니다 (예 : "in (: in1, : in2, : in3)").

IN 절의 값으로 풀어야하는 배열이나 목록 (또는 다른 컨테이너)을 지정하는 방법이 있습니까?

답변:


208

JPA 1.0에 대해 잘 모르겠지만 CollectionJPA 2.0에서 전달할 수 있습니다 .

String qlString = "select item from Item item where item.name IN :names"; 
Query q = em.createQuery(qlString, Item.class);

List<String> names = Arrays.asList("foo", "bar");

q.setParameter("names", names);
List<Item> actual = q.getResultList();

assertNotNull(actual);
assertEquals(2, actual.size());

EclipseLInk로 테스트되었습니다. Hibernate 3.5.1에서는 매개 변수를 괄호로 묶어야합니다.

String qlString = "select item from Item item where item.name IN (:names)";

그러나 이것은 버그이며, 이전 샘플의 JPQL 쿼리는 유효한 JPQL입니다. HHH-5126을 참조하십시오 .


5
"in 절"에 사용할 이름의 최대 개수가 있습니까?
Gondim 2011 년

3
Hibernate에서
앞서 언급 한

1
@pringlesinn 인 - 절에있는 값의 수는 DBMS에 따라 달라집니다
팀 쎄

JPA 1.0에서 작동 (괄호와의 의무적 서라운드하지만 가독성을 위해 당신이해야)
하비에르 리오스

=> item.name in (like : names)
dzgeek

3

Oracle 한계는 1000 개의 매개 변수입니다. 전달 된 매개 변수 목록을 500 개 세트로 분할하여 JIRA HHH-1123을 참조 하지만이 문제는 버전 4.1.7에서 최대 절전 모드로 해결되었습니다.


1
불행히도 이것은 해결되지 않았습니다. 티켓은 해결 된 것으로 표시되었지만 문제 (코멘트에 표시된대로)는 Hibernate 팀에 의해 해결되지 않았습니다.
Druckles

@Druckles 음 어디? 2016 년 이전의 댓글은 없습니다. 그리고 그 댓글은 일반적인 인터넷 'help plz !!! 11 !!!!'외에는 거의 아무것도 말하지 않는 단 두 개의 댓글이었습니다. 해결 된 버그 보고서를 신뢰할 이유가 없습니다.
searchengine27

@ searchengine27 보고서가 해결 된 것으로 표시 되었음에도 불구하고 해결 되지 않았다고 말했습니다 . 해결책은 Steve Ebersole이보고 한 바와 같이 "이 문제에 대한 해결책은 단순히이 조건이 감지되면 로깅을 통해 사용자에게 경고하는 것입니다." 2012 년 Noel Trout의 논평은 이것이 왜 충분하지 않은지에 대해 확장합니다.
Druckles

즉,이 대답은 잘못되었거나 기껏해야 오해의 소지가 있습니다.
Druckles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.