2011-08-25 189 views
2

首先,這是關於ORing兩個標準,而不是兩個標準。休眠ORing兩個標準

作爲查詢的一部分,我想這樣做:

from voters v 
left join addresses a on v.addressId = a.addressId 
left join precincts p on a.areaId = a.precinctId 
left join overlaps o on o.areaId1 = p.areaId 
where p.areaId = ? or o.areaId2 = ? 

和兩個?是相同的價值。我已經得到了一點,但現在卡住了。這是我有什麼

criteria = session.createCriteria(Voter.class); 
addressCriteria = criteria.createCriteria("address"); 
precinctCriteria = addressCriteria.createCriteria("precinct"); 
overlapsCriteria = precinctCriteria.createCriteria("overlaps"); 

我想要做以下,但它不起作用。

SimpleExpression lhs = Restrictions.eq("precinct.id", areaId); 
SimpleExpression rhs = Restrictions.eq("overlaps.id", areaId); 
LogicalExpression criterion = Restrictions.or(lhs, rhs); 

那麼,我真的該怎麼辦?我認爲它涉及createAlias(...),但我不知道如何。我將添加最後一條標準到哪個標準?第一個?

回答

2

使用Disjunction

Disjunction dis = Restrictions.disjunction(); 
dis.add(Restrictions.eq("precinct.id", areaId)); 
dis.add(Restrictions.eq("overlaps.id", areaId)); 
criteria.add(dis); 

請注意,您可能需要別名precinctoverlaps

+0

謝謝。這讓我更接近我需要的地方。我不得不使用createAlias(),這是我之前沒有用過的。然而,最終我得到了太多的結果。我需要使用Distinct或子查詢。工會顯然沒有問題。我會先嚐試子查詢。 –