我有这个问题:
@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还与其他实体有一些关联,我没有包含在连接提取中,我是否还需要加入获取它们才能在一个查询中完成所有操作?
答案 0 :(得分:0)
您可能希望至少指定一个设置为lazy loaded。
答案 1 :(得分:0)
将其他相关集合添加为&#39; join fetches&#39;在查询中修复它,整个事情在1个查询中运行。我认为使用查询会覆盖默认的提取策略,但是其中没有连接提取的其他关系的事实意味着Hibernate对它们的处理方式不同。
我仍然有兴趣听听关于调整获取策略是否也有帮助的评论,也就是说,我是否应该将获取策略设置为“加入”?无论如何,N + 1现在已经以这种或那种方式固定。