0

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

我究竟做错了什么?

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

1 回答 1

0

可能该行为由以下行解释:

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

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

于 2018-06-07T20:39:05.940 回答