Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 弹簧分页中的偏移量计算_Spring_Mongodb_Spring Boot_Spring Data_Spring Data Jpa - Fatal编程技术网

Spring 弹簧分页中的偏移量计算

Spring 弹簧分页中的偏移量计算,spring,mongodb,spring-boot,spring-data,spring-data-jpa,Spring,Mongodb,Spring Boot,Spring Data,Spring Data Jpa,我有一个分页索引从1开始的服务。我在一些逻辑之后得到实体列表,我返回与下面相同的(响应) 我得到的回复是 {"content": [ { "id": "e1", }{ "id": "2", } ], "last": false, "totalElements": 102, "totalPages": 2, "size": 100, "number": 1

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

我得到的回复是

{"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的响应。因此,我正试图将我的服务与此对齐,以便整个逻辑遵循相同的索引。

这有什么错
totalElements
告诉您数据源中存储了多少个元素
numberOfElements
告诉您当前页面包含多少元素。 当您总共有102个元素,并且请求大小为100的第2页时,您应该会得到与您收到的完全相同的响应

什么可能让你困惑:


使用
new PageRequest(1100)
您请求的是第二个页面,因为索引从0开始。

您得到的结果是正确的,因为
PageRequest
使用了如下所述的零基页面:

参数

页面-基于零的页面索引

size—要返回的页面的大小

这意味着您要检索第二个页面(而不是第一个页面),因为您有100条记录的限制,总共有102条记录,所以您只能检索最后两条

您仍然可以公开基于1的数字,但:

new PageRequest(page-1, 100);

或者,您可以通过实现
Pageable
对其进行自定义。这允许您覆盖弹簧数据使用的实际偏移


尽管如此,这并没有改变Spring数据期望
getPageNumber()
是一个基于零的数字的事实。你不能改变这一点,你只能在上面添加一个抽象层来满足你的需求。

是的。所以我希望PageRequest与服务保持一致,就像我给PageRequest新的PageRequest(1100)一样它应该将其视为第1页。除了实现自定义PageImpl并重写偏移逻辑之外,还有其他方法吗。否。这是你不能改变的!如果您想获得第一页,您必须执行
newpagerequest(01100)
。它到底有什么好处?在Java中(实际上在大多数语言中),索引都是基于0的。如果我这样做,那么元素总数将是正确的,但是页码将是0,并且用户已经请求了页码1。我之所以有这种情况,是因为为了获得响应,我使用了索引为1的第三方服务。这是一个索引。第一个索引始终从0开始。从1开始索引通常会出现问题。阅读本文以获得科学推理:这样看:在
newpagerequest(01100)
0
表示与可能的页面列表的偏移量。意味着您将跳过0页,进入第一页。拥有
newpagerequest(1100)
意味着您希望跳过1页,从而获得第2页。您可以(或至少过去可以)为第一页配置0/1。在Spring数据库的早期版本中,默认值实际上是1。如果有任何用处,您可以将Spring数据配置为在第一页使用1而不是0,如下所述:
this.total = !content.isEmpty() && pageable != null && pageable.getOffset() 
+ pageable.getPageSize() > total
                ? pageable.getOffset() + content.size() : total;
new PageRequest(page-1, 100);