首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用投影忽略Hibernate criteria setFetchMode

使用投影忽略Hibernate criteria setFetchMode
EN

Stack Overflow用户
提问于 2018-06-08 03:42:40
回答 1查看 267关注 0票数 0

我正在尝试获取所有的contentItems以避免N+1延迟初始化问题,但是我的setfetchmode调用在使用投影时被hibernate忽略了。虽然不使用投影,但它的工作方式与预期的一样。

我做错了什么?

contentItem是一个自定义对象。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
private ContentItem contentItem;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "content_item_id")
public ContentItem getContentItem() {
    return this.contentItem;
}

像这样重新定位setFetchMode也没有任何效果。

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

发布于 2018-06-08 04:39:06

可能这种行为可以用下面这一行来解释:

代码语言:javascript
复制
.add(Projections.property("contentItem"), "contentItem"))

此时,为了投影这个实体的关系,Hibernate使用在您定义关系的实体中定义的FetchType。因此,您随后添加的FetchMode.JOIN不会产生影响,因为它会在以后发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档