获取连接不应该在分页查询中使用(例如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();
Run Code Online (Sandbox Code Playgroud)
应该避免。
有人可以解释一下这一禁令背后的理由是什么吗?
更新
我发现这篇文章解释了一切。
更新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)
Run Code Online (Sandbox Code Playgroud)
)
这是因为如果JOIN直接使用限制偏移并将其应用到 SQL,您最终会得到相关实体的可能被截断的列表。
例如,如果我们将拥有Person并Friends获取前 5 条记录(首页,5 个大小的项目),您最终将得到 1 个人和 5 个朋友,而事实上,您希望有 5 个人和所有朋友。
为了克服这个问题,hiberante 将无限制地执行整个查询,并在聚合后应用限制/偏移量。这将使例如可迭代游标根本不可迭代。
HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |