我有一个从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 但我还是“totalElements”:102
我发现的问题是因为PageImpl
中的pageable.getOffset()计算this.total = !content.isEmpty() && pageable != null && pageable.getOffset()
+ pageable.getPageSize() > total
? pageable.getOffset() + content.size() : total;
在我的第一页的场景中,我的偏移量为100(1 * 100)。我该如何解决这个问题。
注意:我使用第三方服务来获取索引为1的响应。所以我试图将我的服务与之对齐,以便整个逻辑遵循相同的索引。
答案 0 :(得分:2)
您获得的结果是正确的,因为PageRequest
使用了基于零的网页,如API docs中所述:
<强>参数强>:
page - 从零开始的页面索引。
size - 要返回的页面大小。
这意味着您正在检索第二页(而不是第一页),并且由于您有100条记录的限制和总共102条记录,因此您只能检索最后两条记录。
您仍然可以公开基于1的数字:
new PageRequest(page-1, 100);
或者,您可以通过实施Pageable
来自定义此功能。这允许您覆盖Spring数据使用的实际偏移量。
尽管如此,这并没有改变Spring数据期望getPageNumber()
是基于零的数字这一事实。您无法更改它,您只能在其上添加一个抽象层,以使其符合您的要求。
答案 1 :(得分:1)
那有什么不对? totalElements
告诉您数据源中存储了多少元素。 numberOfElements
告诉您当前页面包含多少元素。
当总共有102个元素并且您要求第2页的大小为100时,您应该得到您收到的响应。
可能让您感到困惑的是:
使用new PageRequest(1, 100)
,您要求第二页面,因为索引从0开始。