我正在尝试获取所有的contentItems以避免N+1延迟初始化问题,但是我的setfetchmode调用在使用投影时被hibernate忽略了。虽然不使用投影,但它的工作方式与预期的一样。
我做错了什么?
contentItem是一个自定义对象。
Session session = getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Media.class);
criteria
.setProjection(Projections.projectionList()
.add(Projections.property("id"), "id")
.add(Projections.property("fileName"), "fileName")
.add(Projections.property("mimeType"), "mimeType")
.add(Projections.property("contentItem"), "contentItem"))
.setFetchMode("contentItem", FetchMode.JOIN)
.setResultTransformer(Transformers.aliasToBean(Media.class));
criteria.addOrder(Order.asc("id"));
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
return criteria.list();
更新:除了@NiVeR answer
实体关系获取类型仍然对结果没有影响。
private ContentItem contentItem;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "content_item_id")
public ContentItem getContentItem() {
return this.contentItem;
}
像这样重新定位setFetchMode也没有任何效果。
Session session = getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Media.class);
criteria.setFetchMode("contentItem", FetchMode.JOIN);
criteria
.setProjection(Projections.projectionList()
.add(Projections.property("id"), "id")
.add(Projections.property("fileName"), "fileName")
.add(Projections.property("mimeType"), "mimeType")
.add(Projections.property("contentItem"), "contentItem"))
.setResultTransformer(Transformers.aliasToBean(Media.class));
criteria.addOrder(Order.asc("id"));
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
return criteria.list();
发布于 2018-06-08 04:39:06
可能这种行为可以用下面这一行来解释:
.add(Projections.property("contentItem"), "contentItem"))
此时,为了投影这个实体的关系,Hibernate使用在您定义关系的实体中定义的FetchType。因此,您随后添加的FetchMode.JOIN不会产生影响,因为它会在以后发生。
https://stackoverflow.com/questions/50749079
复制相似问题