Spring Boot分页返回值异常:使用MongoTemplate构造Page时total参数错误
异常成因
- 核心错误:
PageableExecutionUtils.getPage的第三个入参为总条数供给函数,要求返回全量符合查询条件的总记录数,你当前传入的Lambda返回的是当前查询得到的orders列表长度,不属于全局总条数,会导致分页参数计算完全错误。 - 附加适配错误:
PageRequest构造要求传入的页码是0起始的,如果你传入的pageIndex是业务层常用的1起始页码(比如前端传递的第1页对应值为1),会导致偏移量计算为pageIndex * 页容量,结合错误的总条数逻辑,就会出现totalElements异常变大、总页数不符合预期的问题。
解决方案
你需要调整查询逻辑,补充全量计数步骤,适配页码规则,具体如下:
- 先使用MongoTemplate的
count方法,传入和查询orders完全一致的查询条件,得到全局符合条件的总记录数。 - 如果业务层传递的
pageIndex为1起始,构造PageRequest时需要减1,适配Spring Data的0起始页码规则。 - 查询当前页数据时,要给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.
相关产品推荐
相关产品推荐

