2011-12-21 2 views
1

Oracle에서 SQL Server로 JBoss5.1.0GA에 포함 된 버전에 대해 확신 할 수없는 Hibernate에서 일부 프로젝트를 마이그레이션하려고합니다.IN 술어에서 SQL Server + 최대 절전 모드 복합 키가 실패합니다.

... 
FROM k join k.defs kd 
    ... 
WHERE ... 
    kd not in (SELECT d.defs FROM d ...) 

는 MSSQL에서이 쿼리로 실행 (실패) :

.... 
WHERE 
    ( 
    (kd.ITEM_ID, kd.DEF_ID) not in (
     SELECT 
      defs.ITEM_ID, defs.DEF_ID 

kd 법인이 개 필드 ITEM_ID 및 DEF_ID의 화합물 키가 같은 HQL에 쿼리의

하나가 보인다 . Oracle은 compound IN 술어를 지원하지 않으므로 SQL Server가 실패합니다.

분명히 그것은 Hibernate에 의해 생성 된 매핑의 버그입니다. 내 질문은 : 참여 샘플의 필드별로 비교를 제공하기 위해 최대 절전 모드를 구성/패치하는 방법은 무엇입니까?

답변

0

동일한 작업을 수행해야합니다. 왼쪽 외부 조인은 k의 모든 행과 on과 일치하는 d의 행을 포함합니다. d는 일치하지 않는 경우 null입니다. 내 구문이 조금 벗어 났을 수도 있습니다. 테스트 할 수있는 곳이 아니지만 시작하면 좋겠다.

FROM k join k.defs kd 
left outer join d.defs kd 
    ... 
WHERE ... 
    d is null 
+0

내 질문에 관심을 가져 주셔서 감사합니다. 'NOT EXISTS'는'NOT IN' 술어를 대체하는보다 우아한 방법입니다. 코드는 유산이고 변경은 부작용을 일으킬 수 있기 때문에 마지막 해결책으로 남겨 둘 것입니다. 그래서 절전 모드로 조작하는 것에 대해 질문하십시오 - 패치를하려면 (상위 버전이거나 특정 클래스를 변경하십시오). – Dewfy