休眠条件 setFetchMode 使用投影被忽略



我试图急切地获取所有内容项目以避免N + 1延迟初始化问题,但是在使用投影时,我的setfetchmode调用被休眠忽略。虽然不使用投影,但它按预期工作。

我做错了什么?

内容项是一个自定义对象。

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答案

实体关系提取类型仍然对结果没有影响。

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();

可能行为可以用以下行来解释:

.add(Projections.property("contentItem"), "contentItem"))

此时,为了投影此实体的关系,Hibernate使用在您定义关系的实体中定义的FetchType。因此,您之后添加的 FetchMode.JOIN 没有影响,因为它稍后发生。

最新更新