2009-10-06 208 views
16

假設我有類,如:休眠條件查詢

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

class B { 
String getFoo(); 
} 

class C { 
int getBar(); 
} 

,我要篩選標準,但在不同的子類的屬性兩個過濾器,如:

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結合起來,例如:

//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

別名是不必要的。 – 2009-10-06 22:17:33

+0

試試這個 - 再次感謝,國際象棋 – RMorrisey 2009-10-06 22:19:55

+0

你會怎樣做這個沒有別名? – RMorrisey 2009-10-06 22:20:54

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:com.myproject.A – RMorrisey 2009-10-06 22:34:42

+0

聽起來像這隻適用於一個屬性級別,但不適用於我正在使用的實際過濾器。 – RMorrisey 2009-10-06 22:38:36

+0

您必須使用createQuery的createAlias。我相應地編輯了答案。 – 2012-03-12 11:55:35

3

萬一別人發現它很有用,我發現了一個更復雜的答案,這似乎由API允許的問題,雖然我沒有測試它ChssPly張貼了他的(簡單的)解決方案之前:

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 2009-10-06 23:00:35