Spring Pagination中的偏移计算

时间:2017-10-19 12:03:20

标签: spring mongodb spring-boot spring-data spring-data-jpa

我有一个从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的响应。所以我试图将我的服务与之对齐,以便整个逻辑遵循相同的索引。

2 个答案:

答案 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开始。