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失效的问题处理,希望对有同样场景的小伙伴有所帮助!


相关文章
|
7月前
PageHelper分页插件拼接动态排序语句
PageHelper分页插件拼接动态排序语句
246 0
|
7月前
|
XML Java 数据库连接
MyBatis返回Map时值为null的字段会丢失
MyBatis返回Map时值为null的字段会丢失
140 2
|
SQL Oracle 关系型数据库
第5章_排序与分页
第5章_排序与分页
53 0
|
前端开发
使用PageHelper插件获取数据总条数不对的问题的解决方案
使用PageHelper插件获取数据总条数不对的问题的解决方案
384 0
|
前端开发 Java 数据库
pagination分页插件的getResult明明有数据,但是getTotal方法为0
pagination分页插件的getResult明明有数据,但是getTotal方法为0
304 0
pageable 使用自定义list实现分页
pageable 使用自定义list实现分页
141 0
|
数据库
pagehelper分页查询明明下一页没有数据了却还是返回了数据
pagehelper分页查询明明下一页没有数据了却还是返回了数据
515 0
分页获取数据列表GetListByPage
分页获取数据列表GetListByPage
96 0
|
数据采集 算法 前端开发
查询分页不只有 limit,这四种分页方法值得掌握
查询分页不只有 limit,这四种分页方法值得掌握
277 0
查询分页不只有 limit,这四种分页方法值得掌握