2014-01-17 53 views
2

我正在使用Hibernate 3.5,我試圖做一個搜索,它將返回一個包含關鍵字的父對象,或者如果其中一個子對象包含一個父項,則返回一個父項關鍵詞。休眠Critera查詢OR父子關聯

這裏是使用Cat從Hibernate Documentation一個例子:

@Entity 
    @Table(name="cats") 
    public class Cat { 
     private String name; 
     private Set<Cat> kittens; 
    } 

下面是從Criteria Query部的示例查詢:

Criteria criteria = session.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "F%") 
    .createAlias("kittens", "kits") 
    .addRestrictions.like("kits.name", "F%"); 
List<Cat> cats = criteria.list(); 

這將只返回貓對象,其中的名稱父母以F開頭,並且其中一隻小貓的名字以F開頭。我想創建一個查詢來返回這些限制的邏輯和。貓的名字以F開頭,或貓的名字以F開頭的小貓。 例子:(貓:[Kittens]) Fritz:[],Frank:[Al,Barry],Charlie:[Fran];應該都包含在結果集中。 雖然鮑勃:[]和邁克:[艾倫,博斯科]不應該。

我已經嘗試了幾個不同的查詢,但一直無法獲得正確的結果。

Criteria criteria = session.createCritera(Cat.class) 
    .add(Restrictions.like("name", "F%); 

該查詢返回所有家長貓名稱以F.

Criteria criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.like("kits.name", "F%"); 

該查詢返回誰擁有小貓他的名字與F. 這是我的麻煩開始的地方開始的所有父貓,我需要這兩套的分離。首先我試過:

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.disjunction() 
     .add(Restrictions.like("name", "F%") 
     .add(Restrictions.like("kits.name", "F%"); 

此查詢不起作用。它僅返回子女姓名以F開頭的父母,就像之前的查詢一樣。

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.or(
     Restrictions.like("name", "F%"), 
     Restrictions.like("kits.name", "F%")); 

如果我正確閱讀API文檔,則此查詢與上一個查詢相同。這是有道理的,因爲我得到了與前兩個查詢相同的結果。

作爲一種通過標準搜索得到正確的貓羣結果的方式,我被難住了。

我想我可以運行兩個單獨的查詢,然後清理結果集合,但似乎不必要的不​​雅。

任何建議表示讚賞。 喵。

回答

1

嘗試:

Criteria.criteria = session.createCriteria(Cat.class) 
.createAlias("kittens", "kits", Criteria.LEFT_JOIN) 
.add(Restrictions.or(
    Restrictions.like("name", "F%"), 
    Restrictions.like("kits.name", "F%")); 

這應該工作。