Hibernate join fetch做了N + 1,如何解决?

时间:2015-04-24 15:13:54

标签: hibernate join left-join fetch

我有这个问题:

@NamedQuery(
        name = "org.mygovscot.stars.model.UserNeed.findAll", query =
            "SELECT un FROM UserNeed un " +
            "LEFT JOIN FETCH un.services "
    )

使用从Service到UserNeed的映射:

<set name="userNeeds" table="service_userNeed">
  <key column="service_id"/>
  <many-to-many column="userNeed_id" class="UserNeed"/>
</set>

以及从UserNeed到Service的映射:

<set name="services" table="service_userNeed">
  <key column="userNeed_id"/>
  <many-to-many column="service_id" class="Service"/>
</set>

也就是说,它是双向的多对多。

我这样查询:

currentSession()
    .getNamedQuery("org.mygovscot.stars.model.UserNeed.findAll")
    .list();

我的理解是“连接提取”会急切地获取关联,从而避免进行N + 1查询。但是,结果是Hibernate执行N + 1来获取所有UserNeeds。

这是怎么回事? UserNeed还与其他实体有一些关联,我没有包含在连接提取中,我是否还需要加入获取它们才能在一个查询中完成所有操作?

2 个答案:

答案 0 :(得分:0)

您可能希望至少指定一个设置为lazy loaded

答案 1 :(得分:0)

将其他相关集合添加为&#39; join fetches&#39;在查询中修复它,整个事情在1个查询中运行。我认为使用查询会覆盖默认的提取策略,但是其中没有连接提取的其他关系的事实意味着Hibernate对它们的处理方式不同。

我仍然有兴趣听听关于调整获取策略是否也有帮助的评论,也就是说,我是否应该将获取策略设置为“加入”?无论如何,N + 1现在已经以这种或那种方式固定。