微信公众号:[一起学习大数据呀] 关注可学习更多奇怪的知识!
前言
前几天搞分页遇到一个大头,大佬让我用 PageHelper 来写,看了看其他项目来参考。
结果还是翻车了!!!
原先代码
public Result<PageInfo<TestVo >> queryList(Integer pageIndex, Integer pageSize){
// pageIndex 表示第几页开始
// pageSize 表示每页几条数据
PageHelper.startPage(pageIndex, pageSize);
//获取所有信息
List<TestEntity> list = xxxService.findXXXList();
//entity 转 Vo
List<TestVo > voList = new ArrayList<>();
for(TestEntity entity : list){
TestVo testVo = new TestVo();
BeanUtils.copyProperties(entity, testVo );
voList.add(vo);
}
PageInfo<TestVo > pageInfo = new PageInfo<>(TestVo );
return Result.success(pageInfo);
}
于是问题来了,就是返回的总页数总期望是 80 条的,可是当前页只有 20 条,总数 20 条。
排查
我参考了大佬的写法,没啥异常,语法(包括 SQL 语句)SQL语句拿去执行全部结果都查出。
至于什么pom 文件等基础配置是有的,毕竟有大佬调用过 PageHelper 了
去网上博客兜兜转转,好家伙,原来问题就是出现在 entity 转 Vo 这个步骤。
修改之后
public Result<PageInfo<TestVo >> queryList(Integer pageIndex, Integer pageSize){
// pageIndex 表示第几页开始
// pageSize 表示每页几条数据
PageHelper.startPage(pageIndex, pageSize);
//获取所有信息
List<TestEntity> list = xxxService.findXXXList();
//add
PageInfo<TestEntity> page = new PageInfo<>(list);
//entity 转 Vo
List<TestVo > voList = new ArrayList<>();
for(TestEntity entity : list){
TestVo testVo = new TestVo();
BeanUtils.copyProperties(entity, testVo );
voList.add(vo);
}
PageInfo<TestVo > pageInfo = new PageInfo<>(volist);
//entity page 信息复制到 vo page
BeanUtils.copyProperties(page ,pageInfo );
return Result.success(pageInfo);
}
总结
1)首先 PageHelper.startPage(pageIndex, pageSize); 是返回 Page 实例,里面包含了总数,当前页数量等信息;
2)List list = xxxService.findXXXList(); 这个 list 通过分页插件处理后的结果,表面上是 List 类型,实际是 Page( extends ArrayList)。
PageInfo 源码:
public PageInfo(List<T> list) {
this(list, 8);
}
public PageInfo(List<T> list, int navigatePages) {
super(list);
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
// instanceof 是测试它左边的对象是否是它右边的类的实例
if (list instanceof Page) { //这步才是我们要的!!!
Page page = (Page)list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.size = page.size();
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
this.calcNavigatepageNums();
this.calcPage();
this.judgePageBoudary();
}
}
3)当我们把 entity 类型的 list 转为 vo 类型的 list,然后放进 PageInfo 那么会丢失分页信息。
参考文献
1: PageInfo返回的total不正确,和list的size一样
2: pageInfo 的 total 属性是当前页记录数,如何配置使 total 设置成总记录数