场景描述
现有一查询会员上课记录的需求,要求按照上课时间进行倒序排列,考虑到后期数据量很多,使用逻辑层进行排序,但是前端小姐姐反应说查询的总记录数不正确.测试库中每页查询20条,实际所有数据总共37条,但是返回的总记录数竟然是20条,说明pageHelper分页失效.
以下是逻辑层代码:
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; }
查询之后数据:
以上是对stream排序导致pageHelper失效的问题处理,希望对有同样场景的小伙伴有所帮助!