2011-09-08 2 views
4

나는이 같은 계층에 4 개 단체 있습니다Hibernate (및 JPA) 기준의 표현력에 대한 제한?

   Parent 
        | 
     ------------------------ 
     |   |   | 
    Child1  Child2  Child3 

을 그리고 나는 단일 쿼리의 기준에 모든 자식 1과 자식 2의 인스턴스 (그러나 Child3 인스턴스를) 검색에 관심이 있어요.

FROM Parent obj 
WHERE obj IN (FROM Child1 where fieldOfChild1="aa") OR 
     obj IN (FROM Child2 where fieldOfChild2=55) 

나는이 기준 등이 질의를 표현할 수있는 방법을 찾을 수없는 최대 절전 모드 기준 및 JPA 기준 API와 을 공부 다음과 같이

이 HQL (또는 JPQL)와 함께 할 쉽다 .

Criteria API의 제한 사항입니까? 아니면 내가 그 길을 놓친 것일까? 어떤 힌트?

답변

1

매핑의 각 하위 클래스에 대한 식별자 값이있는 경우 (예 : Child1의 경우 1, Child2의 경우 2, Child3의 경우 3) HQL/Criteria에서 특수 특성 "class"를 사용할 수 있습니다.

그래서 criteria 질의는 다음과 같이 수 :

session.createCriteria(Parent.class) 
     .add(Restrictions.or(Restrictions.eq("class", 1), 
          Restrictions.eq("class", 2))) 

그리고 당신의 HQL 쿼리를 단순화 :

FROM parent WHERE class = 1 OR class = 2 
+0

감사합니다. 나는 그런 discriminator가 없다. 그러나 어쨌든, 하위 쿼리는 하위 필드의 특정 필드에 대한 참조를 할 수 있습니다. 문제를 단순화했습니다. ** **이 문제를 언급하여 **이를 수정했습니다. – edutesoy

-1

글쎄, 당신은, 당신은 당신의 코멘트에있는 당신의 클래스 계층 구조를 매핑하지 않은 말했다 너?

따라서 Child1 및 Child2에 대한 쿼리를 기준으로 작성할 수 없습니다. 사실 부모가 매핑되지 않았기 때문에 HQL 예제가 작동한다고 생각하지 않습니다.

하나의 못 생기는 해결책은 Child1에 대한 Criteria 쿼리와 Child2에 대한 다른 Criteria 쿼리를 쿼리하는 것입니다. 그리고 나서 자바 코드에서 두 결과 목록을 병합하십시오 : ( 또는 계층 구조를 매핑하십시오 :)

+1

물론 작동한다. Hibernate는 클래스들을 검사하고 인터페이스를 발견한다. 나는 부모님이 당신으로 매핑되어야한다고 생각했고 실제로 필요 없다는 것을 알았을 때 나는 놀랐다. 2 쿼리 솔루션의 경우 데이터를 모두 메모리에로드하고 _Criteria가 충분히 강력하지 않기 때문에 3 개의 쿼리를 작성하지 않으려합니다. 나는 HQL에서 그것을 선호한다. 나는 단지 그것이 Criteria의 잘못이고 내 것이 아닌지 확신하고 싶었다. :) 어쨌든, 내가 계층을 매핑하더라도, 다른 답변 (나는 그 상황을 반영하기 위해 질문을 업데이트했다)의 주석에서 말한 것처럼 여전히 작동하지 않을 것이다. 고맙습니다!! – edutesoy

관련 문제