记录一次PageHelper分页失效的原因

SpringBoot项目,
引入的分页jar包依赖:

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.2.2</version>
</dependency>
PageHelper.startPage(param.getPageNumber(), param.getPageSize());
List list1 = testDao.select1(param,...);
List list2 = testDao.select1(param,...);
List list3 = testDao.select1(param,...);

当方法中PageHelper.startPage(param.getPageNumber(), param.getPageSize());语句后跟着多个查询语句时,只有第一个查询有分页效果的。

### 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)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值