stream排序导致pageHelper分页失效处理

简介: 现有一查询会员上课记录的需求,要求按照上课时间进行倒序排列,考虑到后期数据量很多,使用逻辑层进行排序,但是前端小姐姐反应说查询的总记录数不正确.测试库中每页查询20条,实际所有数据总共37条,但是返回的总记录数竟然是20条,说明pageHelper分页失效.

场景描述


   现有一查询会员上课记录的需求,要求按照上课时间进行倒序排列,考虑到后期数据量很多,使用逻辑层进行排序,但是前端小姐姐反应说查询的总记录数不正确.测试库中每页查询20条,实际所有数据总共37条,但是返回的总记录数竟然是20条,说明pageHelper分页失效.

73762a194065e8023074c7910a168049_74ab7e2cc83e4703b7c631a5842a2949.png

以下是逻辑层代码:

public PageInfo<SignCourseRecord> findSignCourseRecordList(SignCourseQueryDto signCourseQueryDto) {
        PageHelper.startPage(signCourseQueryDto.getPageCurrent(),signCourseQueryDto.getPageSize());
        // 查询上课记录信息
        List<SignCourseRecord> signCourseRecordList = financeMapper.findSignCourseRecordList(signCourseQueryDto);
        // 按照预约时间倒序,性能优化处理:数据库排序改为内存排序
        if(CollectionUtil.isNotEmpty(signCourseRecordList)){
            signCourseRecordList=signCourseRecordList.stream().sorted(Comparator.comparing(SignCourseRecord::getStartTime).reversed()).collect(Collectors.toList());
        }
        PageInfo<SignCourseRecord> signCourseRecordPageInfo = new PageInfo<>(signCourseRecordList);
        return signCourseRecordPageInfo;
    }


   至于失效的原因,之前的帖子已经从源码角度分析过,实际是由stream导致,具体原因可以看下之前写的文章:

stream流导致pageHelper分页失效问题记录

   这里只说处理方案:在此场景中如果还是想继续使用stream进行排序,需要手动更改分页查询的总记录数.看过源码知道,执行查询操作:financeMapper.findSignCourseRecordList(signCourseQueryDto);是先进行查询所有记录的总数量,设置PageInfo中的total总数量(执行select count(1)),然后执行具体的查询sql.所以在sql查询处理之后总的记录数是已经存在的,只需要暂存一下.等到stream逻辑处理之后重新进行总记录数赋值即可.代码如下:


public PageInfo<SignCourseRecord> findSignCourseRecordList(SignCourseQueryDto signCourseQueryDto) {
        PageHelper.startPage(signCourseQueryDto.getPageCurrent(),signCourseQueryDto.getPageSize());
         // 查询上课记录信息
        List<SignCourseRecord> signCourseRecordList = financeMapper.findSignCourseRecordList(signCourseQueryDto);
        // modify by txm 2022/9/14 处理PageHelper分页总数失效问题
        PageInfo<SignCourseRecord> signCourseRecordPageInfo = new PageInfo<>(signCourseRecordList);
        long totalCount = signCourseRecordPageInfo.getTotal();
        // 按照预约时间倒叙,性能优化处理:数据库排序改为内存排序
        if(CollectionUtil.isNotEmpty(signCourseRecordList)){
            signCourseRecordList=signCourseRecordList.stream().sorted(Comparator.comparing(SignCourseRecord::getStartTime).reversed()).collect(Collectors.toList());
        }
  // 设置总记录数以及排序后的记录      signCourseRecordPageInfo.setList(signCourseRecordList);
        signCourseRecordPageInfo.setTotal(totalCount);
        return signCourseRecordPageInfo;
    }


查询之后数据:

2b4ef6ac71f25110ea5ca0ca33d0e810_79551dc14c7c426e8e66aa957b2dc493.png

   以上是对stream排序导致pageHelper失效的问题处理,希望对有同样场景的小伙伴有所帮助!


相关文章
|
SQL 算法 前端开发
【MybatisPlus】MP解决四种表与实体的映射问题,以及id自增策略
MP解决四种表与实体的映射问题,以及id自增策略
3640 0
【MybatisPlus】MP解决四种表与实体的映射问题,以及id自增策略
for、foreach、stream 哪家的效率更高,你真的用对了吗?
昨天在《SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?》一文中,有同学指出Stream在数据量不庞大的情况,效率不如for循环。
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
1195 0
|
机器学习/深度学习 编解码 算法
视频修复技术
视频修复技术
|
11月前
|
Web App开发 网络协议 API
基于C#编写一个远程桌面应用
基于C#编写一个远程桌面应用
450 0
|
11月前
|
人工智能 运维 Devops
自动化运维之路:从脚本到DevOps的转变
【10月更文挑战第7天】在这篇文章中,我们将一起探索自动化运维的演变历程,从最初的简单脚本到现代的DevOps实践。我们将深入理解自动化如何改变了运维工作的本质,并讨论实现这一转变的关键技术和策略。文章将不包含代码示例,而是聚焦于理念、工具和方法论的介绍,旨在为读者提供一个全面的自动化运维框架视图。
138 6
|
11月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(一):torch.cat()模块的详解
这篇博客文章详细介绍了Pytorch中的torch.cat()函数,包括其定义、使用方法和实际代码示例,用于将两个或多个张量沿着指定维度进行拼接。
622 0
Pytorch学习笔记(一):torch.cat()模块的详解
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
前端开发
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
|
NoSQL 关系型数据库 MySQL
聊聊高并发下超卖,少卖的解决方案
聊聊高并发下超卖,少卖的解决方案
646 0