2016-03-07 58 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);