使用投影忽略Hibernate标准setFetchMode

时间:2018-06-07 19:42:40

标签: hibernate fetch criteria hibernate-criteria nhibernate-projections

我试图急切地获取所有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回答

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

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

1 个答案:

答案 0 :(得分:0)

可能行为由行解释:

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

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