You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot分页返回值异常:使用MongoTemplate构造Page时total参数错误

异常成因
  • 核心错误:PageableExecutionUtils.getPage的第三个入参为总条数供给函数,要求返回全量符合查询条件的总记录数,你当前传入的Lambda返回的是当前查询得到的orders列表长度,不属于全局总条数,会导致分页参数计算完全错误。
  • 附加适配错误:PageRequest构造要求传入的页码是0起始的,如果你传入的pageIndex是业务层常用的1起始页码(比如前端传递的第1页对应值为1),会导致偏移量计算为pageIndex * 页容量,结合错误的总条数逻辑,就会出现totalElements异常变大、总页数不符合预期的问题。
解决方案

你需要调整查询逻辑,补充全量计数步骤,适配页码规则,具体如下:

  1. 先使用MongoTemplate的count方法,传入和查询orders完全一致的查询条件,得到全局符合条件的总记录数。
  2. 如果业务层传递的pageIndex为1起始,构造PageRequest时需要减1,适配Spring Data的0起始页码规则。
  3. 查询当前页数据时,要给Query对象关联Pageable参数,自动生成limit、skip逻辑,避免手动处理分页边界。

修正后核心代码示例

// 构造和查询订单完全一致的查询条件
Query query = new Query(Criteria.where("你的查询字段").is("对应条件"));
// 第一步:查询符合条件的总记录数
long totalCount = mongoTemplate.count(query, 你的实体类.class);
// 第二步:构造分页参数,1起始的pageIndex要减1适配0起始规则
Pageable pageable = PageRequest.of(pageIndex - 1, numberOfTransactionsPerPage);
// 第三步:给查询条件增加分页配置,查询当前页数据
query.with(pageable);
List<Order> orders = mongoTemplate.find(query, 你的实体类.class);
// 第四步:传入正确的总记录数构造Page对象
Page<Order> resultPage = PageableExecutionUtils.getPage(orders, pageable, () -> totalCount);

内容的提问来源于stack exchange,提问作者KASMI G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:15:03