2011-09-14 24 views
0

我需要編寫查詢。這是一個簡化的問題: 有名籃子。有水果(0或更多)。籃子有業主(1個或更多)。水果也有業主(1個或更多)。我想得到喬的籃子裏喬的水果名單,包括喬的籃子裏沒有喬的水果。在這裏,我們去:HQL - 2條件下的外連接

select basket.name, fruit.name from Owner owner 
join owner.baskets basket 
left outer join basket.fruits fruit WITH OWNER in (FRUIT.OWNERS) 
where owner.id = joe_id 

但是...它不起作用的HQL。它看起來不錯。在SQL中很簡單。

所以,問題是: 我怎麼能參加更多的則一個條件在HQL或標準API (使用Hibernate 3.3)。

我需要分頁,所以我以後不能提取空籃子,因爲我不能計算哪些項目應放在哪些頁面上。我目前的解決方案是一個本地查詢,但必須有一種方法...

+0

從休眠實際的錯誤信息將是最有幫助這裏... – digitaljoel

+0

我找不到例如堆棧跟蹤任何地方,但它說,這個查詢不正確,因爲WITH子句結合查詢AST的兩個不同的分支條件樹,或沿着這條線的東西。無論如何,如果兩個條件都與同一個對象相關,那麼WITH子句就可以工作:''將left join cat.kittens as * kitten * with * kitten * .bodyWeight> 10.0'(來自hibernate文檔的示例)。其實,無論何時我需要使用WITH,它都不起作用;) – mabn

回答

-1

我認爲你可以用標準API和別名或子標準來解決你的問題。

Hibernate標準創建別名,左外連接爲水果,內層爲籃子。

Criteria criteria = getSession().createCriteria(Account.class).setProjection(
      Projections.projectionList() 
        .add(Property.forName("fruit.name")) 
        .add(Property.forName("basket.name")) 
    ); 
    criteria.createAlias("fruits", "fruit",1); 
    criteria.createAlias("baskets","basket",0); 
    criteria.add(Property.forName("fruit.owner").eqProperty("basket.owner")); 
    List<Object> l = criteria.add(Restrictions.eq("id", some_joe_id_var).list(); 
+0

那麼,它相當於'SELECT .. JOIN ... LEFT OUTER JOIN basket.fruits fruit WHERE fruit.owner = basket.owner',它是不正確的。爲什麼?因爲它將所有喬的籃子與所有水果結合在一起,然後用不屬於喬的水果過濾出結果。它用Ann的蘋果過濾出Joe的綠色籃子,而這個綠色的籃子應該出現在結果中(作爲單行,'綠色'被曬太陽和空果實) – mabn