2013-03-09 59 views
0

我得到了這樣的事情:休眠左加入lazycollection碰不得

Criteria crit = session.createCriteria(Parent.class,"p"); 
parentsList = crit.createCriteria(
    "childSet","c", 
    JoinType.LEFT_OUTER_JOIN, 
    Restrictions.eq("jt.2ndParentDto.pk2ndParentDto", pk2ndParent)) 
    .list(); 

我的查詢返回的父母的列表,每一個孩子或沒有,我已經測試直接登錄查詢,所以我敢肯定它。

我有找回孩子的名單,所以我加入了家長和創造的人失蹤。

List<ChildDto> list=new ArrayList<ChildDto>(); 
for(ParentDto item:parentsList){ 
    Iterator<ChildDto> it=item.getChildSet().iterator(); 
    if(it.hasNext()){ 
     ChildDto dto = it.next(); 
     dto.setParentDto(item); 
     list.add(dto); 
    } 
    else{ 
     ChildDto dto = new ChildDto(); 
     dto.setParentDto(item); 
     list.add(dto); 
    } 
} 
return list; 

通過調用item.getChildSet().iterator()休眠加載整個集合,所以我不能打電話item.getChildSet().iterator().hasNext檢查是否有東西在一組,而我不能叫item.getChildSet().size()既不是完全一樣的道理......

那麼如何?,還有什麼?,我目前沒有想法,如果有一個,我怎麼能得到該集的唯一項目?

更新:我只是想額外的延遲加載,但它不會是好還是壞改變...

item.getChildSet().iterator()還是引起加載整個集合。

當我做item.getChildSet().size()休眠觸發計數...所以我總是得到整個集合(不使用)的大小。

而這幾乎是它=/

更新:我得到了它通過得到的對象[]項目列表,並手動創建的類進行投影工作。 我不喜歡,因爲有變化的HBM,你不得不保持這樣的查詢,要做到這一點,所以我儘量避免這種儘可能。

回答

0

我不知道我知道你要問什麼,但我認爲你正在尋找的Hibernate "extra lazy"集合,它允許你獲得有關收集的一些信息,包括大小,而不初始化整個集合,並且可以批量加載大量集合到內存中,而不是一次加載到內存中。

+0

它涉及到兩個diferent框架傳遞對象的問題,我不能沒有從一個languaje到另一個發送lazycollection,重反射導致從數據庫加載的一切,但我可​​以在我的例子發送代理對象,所以我我正在和他的父母建立一個兒童名單,但我甚至不能讓父母離開集合......(不可觸摸的)。 嘗試額外的懶惰抓取,讓我們看看會發生什麼。 – Ziul 2013-03-09 04:22:58

0

您可以更改查詢返回的子記錄呢?這樣你就不會得到整個系列。我不清楚。你能從數據庫中得到子對象,然後調用getParent()來獲得你需要的父母嗎?

+0

嗯,我認爲這觸發了n + 1個查詢,但是,這也起作用。目前,是我知道通過實體導航的唯一途徑,就是提出這個問題的原因,我不知道如何在不完全加載它們... – Ziul 2013-03-10 09:09:39

+0

這與投影的方法(這是一個不太懶集合互動可維護的代碼)。 – Ziul 2013-03-10 09:16:53