提问者:小点点

Spring分页中的偏移量计算


我有一个分页索引从1开始的服务。我在一些逻辑后获得实体列表,我返回如下相同的(响应)

totalCount = responses.size();
return new PageImpl<>(responses, pageable, totalCount);

当我要求第一页作为

new PageRequest(1, 100)

我得到的回应是

{"content": [
       {
            "id": "e1",
        }{
            "id": "2",
        }
     ],
    "last": false,
    "totalElements": 102,
    "totalPages": 2,
    "size": 100,
    "number": 1,
    "sort": null,
    "first": true,
    "numberOfElements": 2
}

在这里,即使我有“numberOfElements”: 2,我也得到了“总计元素”:102

我发现的问题是因为PageImpl中的pageable. getOffset()计算

this.total = !content.isEmpty() && pageable != null && pageable.getOffset() 
+ pageable.getPageSize() > total
                ? pageable.getOffset() + content.size() : total;

在我的第一页场景中,我的偏移量为100(1*100)。我如何解决这个问题。

注意:我使用第三方服务来获取索引1的响应。所以我试图将我的服务对齐,以便整个逻辑遵循相同的索引。


共2个答案

匿名用户

您得到的结果是正确的,因为PageRequest使用了API文档中所述的从零开始的页面:

参数:

page-从零开始的页面索引。

size-要返回的页面的大小。

这意味着您正在检索第二页(而不是第一页),由于您有100条记录和总共102条记录的限制,您将只检索其中的最后两个。

不过,您仍然可以公开从1开始的数字:

new PageRequest(page-1, 100);

或者,您可以通过实现分页来自定义它。这允许您覆盖Spring数据使用的实际偏移量。

尽管如此,这并不能改变Spring data期望getPageNumber()是一个从零开始的数字的事实。你不能改变这一点,你只能在它上面添加一个抽象层来满足你的要求。

匿名用户

这有什么问题?有多少元素存储在数据源中。numberOfElements告诉您当前页面包含多少元素。当总共有102个元素并且您请求大小为100的第2页时,您应该得到您收到的确切响应。

可能让你困惑的是:

使用new PageRequest(1,100)您正在请求第二页,因为索引从0开始。