我有一个分页索引从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的响应。所以我试图将我的服务对齐,以便整个逻辑遵循相同的索引。
您得到的结果是正确的,因为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开始。