我拿到了这个代码仓库:
@Query(value = "select distinct r from Reference r " +
"inner join fetch r.persons " +
"left outer join fetch r.categories " +
"left outer join fetch r.keywords " +
"left outer join fetch r.parentReferences",
countQuery = "select count(distinct r.id) from Reference r " +
"inner join r.persons " +
"left outer join r.categories " +
"left outer join r.keywords " +
"left outer join r.parentReferences")
Page<Reference> findsAllRelevantEntries(Pageable pageable);
当我在该查询上运行测试时,我得到了这个Hibernate警告:
HHH000104:使用集合获取指定了firstResult/maxResults;将应用于内存中!
@Test
void testFindAllRelevantAsync() throws ExecutionException, InterruptedException {
CompletableFuture<Page<Reference>> all = referenceService.findAllRelevantAsync(PageRequest.of(1, 20));
CompletableFuture.allOf(all).join();
assertThat(all.get()).isNotNull();
assertThat(all.get()).isNotEmpty();
}
代码仓库被封装在一个未展示的服务方法中。该服务方法只是将调用从服务传递到代码仓库,然后再传回来。
此外,生成的 SQL 查询不会生成一个 limit
子句。尽管它会触发两个查询。
其中一个是用于计数,另一个是用于获取所有记录。
因此,它获取所有记录并在内存中应用分页。
这导致查询执行非常缓慢。
如何使该查询支持分页?
编辑
我知道经常建议使用以下解决方案: 如何避免在 Hibernate 中使用集合获取时出现“firstResult/maxResults 指定错误;正在应用于内存!”的警告?
有没有一种方式可以使用 Spring Data JPA 实现分页?
我既不想硬编码一个 EntityManager
,也不想
扩展 BasicTransformerAdapter
的代码。