PageHelper 分页无效的坑。。。

简介: 1.问题阿里巴巴Java开发手册:

image.png

1.1.PageHelper先开启分页,后对list数据操作

@Override
public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {
    PageHelper.startPage(pageNo,pageSize);
    List<HdQueryVo> hdQueryVosByView = actionMapper.getActionByView();
    List<HdQueryVo> hdQueryVos = new ArrayList<>();
    for (HdQueryVo hdQueryVo : hdQueryVosByView) {
        HdQueryVo hdQueryVoSingle = new HdQueryVo();
        hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
        hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
        hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
        hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
        hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
        hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
        hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
        hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
        hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
        hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
        hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
        if (hdQueryVo.getHdType().equals(0)) {
            hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
        } else {
            hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
        }
        hdQueryVos.add(hdQueryVoSingle);
    }
    PageInfo<HdQueryVo> pageViewInfo = new PageInfo<>(hdQueryVos);
    return pageViewInfo;
}

可以分页,但是数据量错误,total始终等于每页数据量,即pageSize

image.png

image.png

@Override
public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {
    List<HdQueryVo> hdQueryVosByView = actionMapper.getActionByView();
    List<HdQueryVo> hdQueryVos = new ArrayList<>();
    for (HdQueryVo hdQueryVo : hdQueryVosByView) {
        HdQueryVo hdQueryVoSingle = new HdQueryVo();
        hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
        hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
        hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
        hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
        hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
        hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
        hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
        hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
        hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
        hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
        hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
        if (hdQueryVo.getHdType().equals(0)) {
            hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
        } else {
            hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
        }
        hdQueryVos.add(hdQueryVoSingle);
    }
    PageHelper.startPage(pageNo,pageSize);
    PageInfo<HdQueryVo> pageViewInfo = new PageInfo<>(hdQueryVos);
    return pageViewInfo;
}

数据可以查询出来,总数total也正确,但是分页功能失效。(这份阿里 Java 开发手册可以关注公众号Java核心技术,回复:手册)

image.png

2.原因

PageHelper中startPage开启分页方法只对后面的sql查询起作用

1.1 错误原因是提前开启分页后,对list操作,即PageInfo pageViewInfo = new PageInfo<>(hdQueryVos);

image.png

即sql语句没有参与分页查询

3.解决方案

直接对分页后的PageInfo对象中的数据进行操作

  • 对list集合操作,先取出PageInfo里的list集合数据,再对数据进行相关操作
  • 将操作完后的list集合再次存到PageInfo里,进行return

image.png

@Override
public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {
    PageInfo<HdQueryVo> source = PageHelper.startPage(pageNo, pageSize).doSelectPageInfo(()->{
        actionMapper.getActionByView();
    });
    // 需要转换的对象
    PageInfo<HdQueryVo> target = new PageInfo<>();
    // 复制分页属性
    BeanUtils.copyProperties(source, target);
    // 对查询的list进行下一步操作,比如类型转换后
    List<HdQueryVo> collect = source.getList().stream().collect(Collectors.toList());
    List<HdQueryVo> hdQueryVos = new ArrayList<>();
    for (HdQueryVo hdQueryVo : collect) {
        HdQueryVo hdQueryVoSingle = new HdQueryVo();
        hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
        hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
        hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
        hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
        hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
        hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
        hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
        hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
        hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
        hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
        hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
        if (hdQueryVo.getHdType().equals(0)) {
            hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
        } else {
            hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
        }
        hdQueryVos.add(hdQueryVoSingle);
    }
    // 加工后的数据放入新的pageinfo
    target.setList(hdQueryVos);
    return target;
}

image.png


目录
相关文章
|
自然语言处理 PyTorch 算法框架/工具
自然语言生成任务中的5种采样方法介绍和Pytorch代码实现
在自然语言生成任务(NLG)中,采样方法是指从生成模型中获取文本输出的一种技术。本文将介绍常用的5中方法并用Pytorch进行实现。
658 0
|
程序员 Linux Ruby
Mac安装并使用telnet命令操作
Mac安装并使用telnet命令操作
18030 1
Mac安装并使用telnet命令操作
|
应用服务中间件 nginx
Nginx日志格式不生效
Nginx日志格式不生效
|
SQL Java 数据库连接
【mybatis】第一篇,Springboot中使用插件PageHelper不生效解决方案
【mybatis】第一篇,Springboot中使用插件PageHelper不生效解决方案
|
2月前
|
Kubernetes 监控 数据可视化
一文掌握k8s的升级更新策略
K8S中通过`spec.strategy`设置Pod替换策略,支持Recreate(重建)和RollingUpdate(滚动升级)。默认为滚动升级,可设`maxUnavailable`和`maxSurge`控制升级过程,实现无中断更新。可通过xkube平台可视化配置。
210 1
|
SQL 缓存 JavaScript
PageHelper 使用中的一些坑
PageHelper 使用中的一些坑
PageHelper 使用中的一些坑
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
574 0
Java中 final、finally、finalize 有什么区别?
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。