Hibernate join fetch执行N+1操作,如何修复它?

Hibernate join fetch执行N+1操作,如何修复它?,hibernate,join,left-join,fetch,Hibernate,Join,Left Join,Fetch,我有一个疑问: @NamedQuery( name = "org.mygovscot.stars.model.UserNeed.findAll", query = "SELECT un FROM UserNeed un " + "LEFT JOIN FETCH un.services " ) 通过此从服务到用户需求的映射: <set name="userNeeds" table="service_userNeed"&

我有一个疑问:

@NamedQuery(
        name = "org.mygovscot.stars.model.UserNeed.findAll", query =
            "SELECT un FROM UserNeed un " +
            "LEFT JOIN FETCH un.services "
    )
通过此从服务到用户需求的映射:

<set name="userNeeds" table="service_userNeed">
  <key column="service_id"/>
  <many-to-many column="userNeed_id" class="UserNeed"/>
</set>
我的理解是,join-fetch会急切地获取关联,从而避免执行N+1查询。然而,结果是Hibernate执行N+1来获取所有用户需求


这是怎么回事?UserNeed还与其他实体有一些关联,我没有将这些关联包括在join fetch中,我是否也需要将它们关联起来,以便在单个查询中完成所有操作?

您可能希望将至少一个集合指定为。

将其他关联集合添加为查询中的“join fetches”修复了它,整个过程在一个查询中运行。我认为使用查询会覆盖默认的获取策略,但事实上,其中还有其他关系没有被连接获取,这意味着Hibernate会以不同的方式对待它们


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

不,不是这样。使用联接获取时,将覆盖实体的获取策略。无论如何,所有关系都是延迟加载的,在本例中,我试图用显式的渴望加载覆盖,因此连接获取。
<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();