2009-10-06 3 views
16

가정하자 내가 좋아하는 수업이 있습니다최대 절전 모드 기준 쿼리

class A { 
B getB(); 
C getC(); 
} 

class B { 
String getFoo(); 
} 

class C { 
int getBar(); 
} 

을하고 내가 좋아하는 A의 기준, 다른 서브 클래스의 특성에 두 개의 필터, 필터링 할 :

Criteria criteriaA = session.createCriteria(A.class); 
Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something")); 
Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0)); 

을 내가하고 싶은 일은 criteriaB와 criteriaC를 "or"절을 사용하여 결합하는 것입니다.

//this does not work 
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC)); 

어떻게해야합니까? 나는 API에 대해 약간의 실수를 저지르고있다. 대신 중첩 된 기준

답변

24

사용 aliases :

Criteria criteria = session.createCriteria(A.class) 
.createAlias("b", "b_alias") 
.createAlias("c", "c_alias") 
.add(Restrictions.disjunction() 
    .add(Restrictions.eq("b_alias.foo", "Something")) 
    .add(Restrictions.eq("c_alias.bar", "0")) 
); 
+0

별칭은 필요하지 않습니다. –

+0

이것을 시도해보십시오 - 다시 감사합니다, Chess – RMorrisey

+0

별칭이 없으면 어떻게할까요? – RMorrisey

4

당신은 하나 개의 기준과 같이 객체를 생성해야합니다. 경우 다른 사람에

Criteria criteria = session.createCriteria(A.class); 
criteria.add(Restriction.disjunction() 
    .add(Restriction.eq("b.foo", "something")) 
    .add(Restriction.eq("c.bar", 0))); 
+0

이것은 작동하지 않습니다. 같은 오류가 발생합니다 : org.hibernate.QueryException : b.foo of : com.myproject.A – RMorrisey

+0

이것은 한 수준의 속성에서만 작동하지만 실제 필터에서는 작동하지 않는 것 같습니다 . – RMorrisey

+0

createQuery의 createAlias를 사용해야합니다. 그에 따라 대답을 편집했습니다. –

3

내가 ChssPly 그의 (간단) 솔루션을 게시하기 전에 그것을 테스트하지 않았지만 나는 API에서 허용하는 표시 문제에 더 복잡한 대답을 발견, 유용 발견 :

DetachedCriteria bValues = DetachedCriteria.forClass(A.class); 
bValues.createCriteria("b").add(Restrictions.eq("foo", "something")); 

DetachedCriteria cValues = DetachedCriteria.forClass(A.class); 
cValues.createCriteria("c").add(Restrictions.eq("bar", 0)); 

Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues)); 
+0

흥미 롭 군, 나는 이런 식으로 시도한 적이 한 번도 없다. 그러나 결과 쿼리는 별칭을 통해 얻은 쿼리와 상당히 다를 수 있습니다 (그리고 느리게 실행될 수도 있음). 하지만 별칭이 실패 할 경우 sqlRestriction 문제를 해결할 수있는 방법 일 수 있습니다. – ChssPly76