pagehelper 只查询条数分页失效
时间: 2025-05-16 12:01:02 浏览: 17
### PageHelper 分页插件查询总条数失效的原因分析
PageHelper 是 MyBatis 的分页插件,其核心功能是通过拦截 SQL 执行来实现分页逻辑。当遇到只查询记录总数的情况时,可能会因为某些配置或代码逻辑问题导致分页失效。
#### 可能原因及解决方案
1. **未正确启用分页插件**
如果 PageHelper 插件未被正确加载或者未注册到 MyBatis 中,则可能导致分页功能完全不可用。需确认 `pom.xml` 或者 Gradle 文件中已引入依赖,并在 Spring Boot 配置文件中启用了插件支持[^2]。
```xml
<!-- Maven 依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>
```
2. **SQL 查询语句不匹配**
PageHelper 默认会解析当前线程中的 SQL 并对其进行改造以完成分页操作。如果手动执行了一个独立的统计查询(如 `SELECT COUNT(*) FROM table_name`),而该查询并未经过 PageHelper 拦截器处理,则不会触发分页机制[^3]。
此种情况下建议统一使用 PageHelper 提供的方法封装查询逻辑,例如:
```java
@Override
public PageInfo<MyEntity> queryEntities(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<MyEntity> result = myMapper.selectAll();
return new PageInfo<>(result);
}
```
3. **数据流操作破坏分页结构**
当对查询结果集进行额外的数据转换(如 Stream API 流式计算)时,可能会影响原始分页对象的内容,尤其是 `total` 字段会被覆盖或丢失[^4]。因此,在调用任何修改集合的操作之前应深拷贝原列表并保留完整的分页元信息。
下面是一个改进版的例子展示如何安全地映射实体类而不干扰原有的分页属性:
```java
protected <T, R> Page<R> convert(Page<T> sourceList, Function<T, R> mapperFunction) {
Page<R> targetPage = new Page<>();
BeanUtils.copyProperties(sourceList, targetPage);
// 清空目标页面内容再填充新映射后的项目
targetPage.clear();
sourceList.forEach(item -> targetPage.add(mapperFunction.apply(item)));
return targetPage;
}
@Test
void testConversion() {
Page<MyOriginalDTO> originalData = ... ;// 假设这是从数据库获取的结果
Page<MyConvertedVO> convertedResult = this.convert(originalData, dto -> {
MyConvertedVO vo = new MyConvertedVO();
vo.setId(dto.getId());
vo.setName(dto.getName().toUpperCase()); // 自定义字段变换规则
return vo;
});
System.out.println(convertedResult.getTotal()); // 应保持不变
}
```
4. **Spring Boot 版本兼容性问题**
对于较新的 Spring Boot (>=3.x),由于内部组件升级等原因可能存在与旧版 PageHelper 不适配的现象。此时可尝试更新至官方推荐的新一代替代品——MyBatis Plus 内建的支持更强大的分页工具。
---
###
阅读全文
相关推荐


















