PageHelper分页失效的几种情况

本文讲述了在Java开发中如何正确使用PageHelper进行分页设置,避免因查询顺序、其他查询操作和后期处理导致分页失效的问题,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1、分页的设置写在了查询的后面

// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();
// 设置分页
PageHelper.startPage(1, 10);

        这种情况把分页的设置放查询上面就好了

2、设置分页与查询之间有其他查询语句

// 设置分页
PageHelper.startPage(1, 10);
// 其他查询
Integer id = anotherService.getById(1046).getId();
// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();

        这种情况下,分页的设置会被用到anotherService的查询上去,导致aService没有分页

        解决方法:把对分页的设置紧贴着查询写

// 其他查询
Integer id = anotherService.getById(1046).getId();
// 设置分页
PageHelper.startPage(1, 10);
// 要设置分页的查询
List<Map<String, Object>> data = aService.listMaps();

3、对查询结果进行增删

// 设置分页
PageHelper.startPage(1, 10);
// 要设置分页的查询
List<Map<String, Object>> data = anotherService.listMaps();
// 对查询结果进行处理
for (int i = data.size() - 1; i >= 0; i--) {
    Map<String, Object> map = data.get(i);
    if (i % 2 == 0) {
        data.remove(map);
    }
}

        这种情况会导致返回的数量和分页条件对不上,建议在有分页查询需求的情况下,把过滤条件放入sql ,而不是对查询到的结果进行过滤

4、其他情况欢迎补充

ps:以上几种情况属于使用不当,而不是PageHelper自身的bug 

### Java PageHelper 分页失效的原因及解决方案 #### 原因分析 PageHelper 是一款用于 MyBatis 的优秀分页插件,但在某些情况下可能会遇到分页失效的问题。这通常发生在以下几种情况: - 对于一对多的结果映射,PageHelper 不支持直接进行分页查询,从而导致分页逻辑失败[^1]。 - 如果在 `PageHelper.startPage` 方法之后执行了其他 SQL 查询或数据处理操作,则可能导致分页信息丢失[^2]。 #### 解决方案一:调整代码结构 为了确保分页功能正常工作,建议将 `PageHelper.startPage` 放置在实际查询语句之前,并且紧跟着查询语句立即获取结果集。这样可以避免由于后续的操作影响到分页效果。 ```java @Override public ResponseResult getStudentScoreList(String search, Integer page, Integer pageSize, UserDetails userInfo) { PageHelper.startPage(page, pageSize); // 紧跟其后的查询语句 List<StudentScoreVO> scoreVOList = studentMapper.getStudentScoreStatus(search, userInfo.getId()); // 处理返回的数据前先封装成 PageInfo 返回给前端 return ResponseResult.success(new PageInfo<>(scoreVOList)); } ``` #### 解决方案二:手动实现分页逻辑 当面对复杂场景无法依赖 PageHelper 自动完成分页时,可以选择通过编程方式构建分页机制。具体做法是在 Service 层中计算总记录数并截取指定范围内的数据条目形成子列表作为最终响应的一部分发送出去。 ```java // 手动分页示例 int offset = (page - 1) * pageSize; List<YourEntity> allItems = yourDao.findAll(); long totalCount = allItems.size(); if (offset >= totalCount || pageSize <= 0){ throw new IllegalArgumentException("Invalid paging parameters"); } List<YourEntity> pagedItems = allItems.stream() .skip(offset) .limit(pageSize) .collect(Collectors.toList()); return new CustomPageResponse(pagedItems, totalCount, page, pageSize); ``` #### 解决方案三:修正 PageInfo 构造函数参数传递顺序 有时即使正确配置了 PageHelper 插件仍然会碰到 total 记录总数显示异常的情况。此时应该检查是否误用了构造器,应按照官方文档说明传入正确的参数以初始化 `PageInfo` 实例对象[^3]。 ```java PageInfo<DataDetailVo> pageInfoCorrect = new PageInfo<>(voList, pageNum); log.info("pageInfoCorrect:" + JSON.toJSONString(pageInfoCorrect)); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值