Hibernate JPA 获取连接不应在分页查询中使用

1 java hibernate jpa

Hibernate 用户指南第 15.14 章中写道:

获取连接不应该在分页查询中使用(例如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-1 惰性关系呢?

  2. 为什么不在幕后实现 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)

Ant*_*sss 5

这是因为如果JOIN直接使用限制偏移并将其应用到 SQL,您最终会得到相关实体的可能被截断的列表。

例如,如果我们将拥有PersonFriends获取前 5 条记录(首页,5 个大小的项目),您最终将得到 1 个人和 5 个朋友,而事实上,您希望有 5 个人和所有朋友。

为了克服这个问题,hiberante 将无限制地执行整个查询,并在聚合后应用限制/偏移量。这将使例如可迭代游标根本不可迭代。

HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
Run Code Online (Sandbox Code Playgroud)