今天发现使用 pagehelper 进行分页时,分页失效了。查了下发现是这个原因,改了之后就正常了,记录一下。代码就不贴了,贴别人的。
1、问题场景
前端反馈分页数据不对,讲道理之前的分页一直正常,不应该出现有问题。
2、业务代码
public ResultVo<PageInfo<StaffCardInfoVo>> findStaffCardList(@Valid StaffCardQueryDto staffCardQueryDto){
PageHelper.startPage(staffCardQueryDto.getPageCurrent(),staffCardQueryDto.getPageSize());
// 查询会员卡列表数据处理
List<StaffCardInfoVo> staffCardList = staffCardService.findStaffCardList(staffCardQueryDto);
PageInfo<StaffCardInfoVo> staffCardInfoVoPageInfo = new PageInfo<>(staffCardList);
return ResultVoUtil.success(staffCardInfoVoPageInfo);
}
3、问题处理说明
pageHelper中调用数据库查询返回的集合信息,实际上返回的是page类型的集合(继承ArrayList),看pageHelper源码就能发现
public class Page<E> extends ArrayList<E> implements Closeable {
private static final long serialVersionUID = 1L;
// 省略属性方法
}
对比其他分页查询接口发现会员卡查询接口中返回的会员卡列表集合的数据类型为ArrayList,非Page集合。然后看到业务实现层中查询数据库之后有使用stream对集合进行处理,处理之后返回的数据类型为ArrayList,也就是失效的原因。
public List<StaffCardInfoVo> findStaffCardList(StaffCardQueryDto staffCardQueryDto) {
// 数据库查询会员卡,此时返回的staffCardList还是page集合类型
List<StaffCardInfoVo> staffCardList = staffCardMapper.findStaffCardList(staffCardQueryDto, Integer.valueOf(manageUserService.getStudioIdByToken()));
staffCardList= staffCardList.stream().map(
staffCardInfoVo -> {
// 会员卡字段处理业务
return staffCardInfoVo;
}
).collect(Collectors.toList());
// 此处返回的会员卡数据类型为ArrayList
return staffCardList;
}
4、处理方案
就是使用for循环替代stream遍历处理,这里仅提供思路不提供具体实现。
下面是我的修改,修改之后就正常了。