2010-10-04 95 views
1

這可能是一個超級簡單的答案,因爲我確信它並不少見。我看到一些類似的問題,但似乎沒有描述我的問題。過濾器懶惰初始化Hibernate集合

我有兩個對象:一輛車和一個人。他們處於多對多的關係中,即一輛車可以擁有多個人,一個人可以擁有多輛車。 Car有一個延遲初始化集合Drivers

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY) 
private Set<Person> people; 

我想找到所有的藍色轎車與業主在25歲以下:

Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias"); 
Criteria bar = foo.createCriteria("drivers", "myDriverAlias"); 
//add restrictions on foo and bar for blue and age, respectively 
baz = foo.list(); 

我的問題是,當我遍歷列表並調用getDrivers()在每輛車上,它初始化收集並獲取該車的所有車手。我想我跑的.list()並沒有在每輛車上設置結果。

我得到了我期望的結果,如果我手動運行SQL休眠正在生成,所以我相當確定這個標準不是問題。

我可以理解爲什麼發生這種情況,但我不知道如何繞過它而無需遍歷每輛車並在每個車上運行查詢。如果可能,我想避免這樣做,並希望得到任何建議。

提前致謝!

回答

3

是你希望的驅動程序收集每輛汽車將只包含誰符合您的標準(即超過25)的人?換句話說,你不希望包含25歲以上人員的Drivers集合?

如果是這種情況,那麼您將需要使用ResultTransformer(請參閱Hibernate文檔的section 15.4),因爲Hibernate在返回結果之前不會過濾集合。

然而,如果問題是驅動器集合被懶惰加載,這是不理想的則設定取模式(I通常使用加入,因爲IIRC FetchMode.EAGER被廢棄)應解決的問題:

baz = persistenceManager.createCriteria(Car.class, "myCarAlias") 
    .setFetchMode("drivers", FetchMode.JOIN) 
    // add additional restrictions here 
    .list(); 
+0

太棒了,謝謝。你提到的第一個案例是我想要的。 – 2010-10-06 18:32:34

1

hibernate文檔的第15.5節。基本上,您可以爲標準查詢設置獲取策略,這應該優先於您爲關係定義的基本獲取策略。

從文檔

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "Fritz%")) 
    .setFetchMode("mate", FetchMode.EAGER) 
    .setFetchMode("kittens", FetchMode.EAGER) 
    .list(); 

和文檔的例子 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

+0

這似乎不能解決問題。我再次檢查了Hibernate的調試輸出,並且它沒有返回或保存條件之外的任何對象。同樣的事情發生雖然:當我迭代列表,我得到我不想要的對象。也許問題在別處? – 2010-10-04 20:00:46

相關問題