【发布时间】:2020-10-26 09:48:59
【问题描述】:
在Hibernate User Guide chapter 15.14 中写道:
Fetch 连接不应用于分页查询(例如 setFirstResult() 或 setMaxResults()),也不应与 scroll() 或 iterate() 特征。
没有进一步解释为什么 JPQL 查询像这样:
List<Person> persons = entityManager.createQuery(
"select distinct pr " +
"from Person pr " +
"left join fetch pr.phones ", Person.class )
.setFirstResult(15)
.setMaxResults(10)
.getResultList();
应该避免。
有人能解释一下这个禁令背后的理由是什么吗?
更新
我发现 this post 解释了一切。
更新 2
更准确地说:
-
既然不能丢行,为什么禁止1-1惰性关系?
-
为什么没有在后台使用 2 个选择来实现? ( 比如:
select pr.id from Person pr where ... pagination select distinct pr from Person pr left join fetch pr.phones where pr.id in (:ids_from_previous_select)
)
【问题讨论】:
-
你有什么异常吗?
-
@DivyeshKanzariya 不,这是一个方法问题,更像是一种反模式。
-
查看这篇综合帖子,特别是 join fetch 部分vladmihalcea.com/query-pagination-jpa-hibernate
-
@Aman 谢谢,但它与我在更新部分提供的链接相同。