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


目录
相关文章
|
关系型数据库 MySQL Docker
docker 安装 mysql(arm64)
docker 安装 mysql(arm64)
1885 0
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
480 0
|
自然语言处理 PyTorch 算法框架/工具
自然语言生成任务中的5种采样方法介绍和Pytorch代码实现
在自然语言生成任务(NLG)中,采样方法是指从生成模型中获取文本输出的一种技术。本文将介绍常用的5中方法并用Pytorch进行实现。
574 0
|
应用服务中间件 nginx
Nginx日志格式不生效
Nginx日志格式不生效
|
缓存 API Android开发
一起学点ARM的微架构二?
一起学点ARM的微架构二?
532 1
|
定位技术
阿里研究员玄难:如何做电商业务中台
2016 ATF阿里技术论坛于4月15日在清华大学举办,主旨是阐述阿里对世界创新做出的贡献。会上阿里业务平台事业部&淘宝基础平台技术部负责人玄难阐释了淘宝经历13年的发展中,业务平台从零到有,同时又逐步演进为业务中台。
41497 0
|
前端开发 Java 数据库连接
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
|
11月前
|
人工智能 编解码 测试技术
ViTPose:最小只有100M的身体姿态估计模型,精确识别人体关节、手、脚等关键点
ViTPose 是基于 Transformer 架构的人体姿态估计模型,能够精准定位人体关键点,支持多种规模版本,适用于运动分析、虚拟现实等场景。
501 8
ViTPose:最小只有100M的身体姿态估计模型,精确识别人体关节、手、脚等关键点
|
机器学习/深度学习 算法 数据挖掘
基于PSO优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
摘要: 本文介绍了运用粒子群优化(PSO)调整深度学习模型超参数以提升时间序列预测性能的方法。在比较了优化前后的效果(Ttttttttttt12 vs Ttttttttttt34)后,阐述了使用matlab2022a软件的算法。文章详细讨论了CNN、GRU网络和注意力机制在时间序列预测中的作用,以及PSO如何优化这些模型的超参数。核心程序展示了PSO的迭代过程,通过限制和调整粒子的位置(x1)和速度(v1),寻找最佳解决方案(gbest1)。最终,结果保存在R2.mat文件中。
基于PSO优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
|
人工智能 前端开发 UED
AI代码生成器——MutableAI
【2月更文挑战第17天】AI代码生成器——MutableAI
598 7
AI代码生成器——MutableAI