Spring Data JPA 分页查询的底层SQL实现

7
我在阅读Spring Data JPA官方文档关于PageSlice之间区别的段落时,发现以下内容(我加了强调):
第一种方法允许您向查询方法传递一个org.springframework.data.domain.Pageable实例,以动态地将分页添加到您静态定义的查询中。Page知道可用的元素和页面总数。它通过基础设施触发计数查询来计算总数。由于这可能很昂贵(取决于所使用的存储),因此可以返回一个Slice。当遍历更大的结果集时,Slice仅知道是否有下一个Slice可用,这可能已经足够。 我理解如何使用Page通过执行具有相同where子句的额外计数查询来获取总元素数,但是Slice如何通过单个查询获知其他元素是否可用? 执行的SQL是什么?

我还想问一下,如果它是一个排序的切片,那么它是否比可分页的要慢?例如:PageRequest.of(0, 10, Direction.DESC, "createdTimestamp")。 - wild_nothing
1个回答

6

如何使用单个查询让 Slice 知道其他元素是否可用?

如果存在一个多余的元素,Spring Data JPA 会选择比实际需要的多选择一个元素来填充 Slice,如果存在这样的额外元素,则表示另一个 Slice 可用。否则,这是最后一个 Slice

查看代码


只是有一个疑问..由于不需要偏移量,那么我们是否必须递增地传递页面大小,例如如果页面大小为10,则在每次无限滚动触发时,我必须将页面大小作为10、20、30、40等依次传递吗? - Vishal Nair
1
@VishalNair,“there is no offset needed”是什么意思?您仍然需要提供一个Pageable,其中包含一个可能为null的偏移量。页面大小必须是您想要的任何页面大小。我认为这应该作为一个适当的问题提出,并提供更多关于您试图解决的问题的细节。 - Jens Schauder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接