2014-10-06 2 views
0

결과를 일부 필드로 그룹화하고 IN 절을 사용하여 결과를 제한해야하는 명명 된 쿼리를 만들어야합니다.OpenJpa에서 큰 목록이있는 IN 절이 너무 복잡한 문을 발생했습니다.

는 내가이는 OpenJPA와 IBM DB2를 사용하고이

SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (:listOfIDs) GROUP BY e.attr1, e.attr2 

같이 보입니다. 어떤 경우에는 ID의 내 목록은 매우 클 수 있습니다 (> 80.000 ID를)과 같은 최종 생성 문 출력합니다 모든 ID를, 때문에 다음 생성 된 SQL 문, DB2 너무 복잡해진다 :

SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (1,2,3,4,5,6,7,...) GROUP BY e.attr1, e.attr2 

인가가 이런 종류의 쿼리를 처리하는 좋은 방법이 있습니까? 가능한 임시 해결책은 임시 테이블에 ID를 작성한 다음이 테이블의 IN 절을 사용하는 것입니다.

+0

JPA는 실제로 "몇 가지"레코드 (여전히 많이있을 수 있음)에 대해 더 많이 고안되었으며 크기 설정은 그렇지 않습니다. 한 번에 그 많은 기록들을 엉망으로 만들고있는 당신은 무엇을하고 있습니까? 가입 할 테이블에 일괄 적으로로드하는 편이 낫습니다 (기존 답변과 유사하지만 특별한 도구가 있습니다). –

답변

0

모든 값을 테이블에 넣고 쿼리를 조인으로 다시 작성해야합니다. 이것은 쿼리 문제를 해결할뿐만 아니라 더 효율적이어야합니다.

declare global temporary table ids (
    objId int 
) with replace on commit preserve rows; 

--If this statement is too long, use a couple of insert statements. 
insert into session.ids values 
    (1,2,3,4,....); 

select new mydto(e.objID) 
    from entity e 
    join session.ids i on 
     e.objId = i.objId 
group by e.attr1, e.attr2; 
+0

이 작업은 가능하지만 JPQL 문의 임시 테이블에 어떻게 액세스합니까? 엔티티로 인식되지 않으므로 "세션"에 직접 액세스 할 수 없습니다. – dako

+0

이것이 최고의 솔루션 인 것 같습니다. 전역 임시 테이블을 사용할 수 없지만 내 접근 방식이 효과적입니다. 나는 "정상적인"테이블을 사용하고 필요시 ID 목록으로 채 웁니다. – dako