2016-03-07 57 views
3

我有一個會話類,它有照片對象的映射集合的子集:休眠:無法預先抓取一個子集合

@OneToMany(fetch = FetchType.EAGER) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "sessionId", insertable = false, updatable = false) 
private SortedSet<Photo> photos = new TreeSet<>(); 

每張照片又具有評價對象的集合,這是指定爲FetchType.LAZY(因爲我並不總是希望他們):

@OneToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY) 
@BatchSize(size=20) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "photoId", insertable = false, updatable = false) 
private SortedSet<Comment> comments = new TreeSet<>(); 

在我的查詢會話,我希望能夠以編程方式決定,對即時,是否包括評論與否。我試過(其他變化):

Criteria criteria = hibSession.createCriteria(Session.class, "s") 
    .createAlias("photos", "p") 
    .setFetchMode("p.comments", FetchMode.JOIN); 

但是,這並沒有這樣做。在任何返回的照片子對象上調用photo.getComments()會拋出一個LazyInitializationException

如果我(仍在原始Hibernate會話的範圍內)遍歷所有會話,並且在所有的照片中,並且調用photo.getComments().size(),它將獲取批註(按指定的批量)。

但是有沒有什麼辦法可以告訴初始查詢只是急切地得到全部評論第一次圍繞,而不需要迭代之後?

謝謝。

+0

不知道這會工作,或者是你想要的,但有您嘗試使用HQL進行此特定查詢嗎?你可以直接在查詢中加入連接。 – Asoub

+0

你使用什麼版本的Hibernate? –

+0

對不起 - 應該提到。它是4.3.6。 – rweiser

回答

0

這可能是衆所周知的Hibernate錯誤HHH-3524,setFetchModeCriteria查詢中無法正常工作。它被封閉爲陳舊的問題,但有些用戶將其報告爲Hibernate版本4.x.x.

爲了解決這個問題,你可以使用HQL因爲它正常工作:

session.createQuery("SELECT s FROM PhotoSession s " + 
    "JOIN FETCH s.photos p " + 
    "JOIN FETCH p.comments"); 

或者使用變通方法與createCriteria(associationPath, JoinType.LEFT_OUTER_JOIN)解決方案:

Criteria criteria = session.createCriteria(PhotoSession.class, "s"); 
criteria.createAlias("photos", "p"); 
criteria.createCriteria("p.comments", "c", JoinType.LEFT_OUTER_JOIN); 
criteria.setFetchMode("c", FetchMode.JOIN);