使用pageHelper,在对数据进行对象转换或者使用stream操作之后分页失效
      
      
    
   
  
  
    
使用pageHelper,在对数据进行对象转换或者使用stream操作之后分页失效
问题描述
使用MyBatis-Plus操作数据库,使用PageHelper插件进行分页操作,直接返回Mapper的分页查询结果数据时分页状态正常,对数据对象进行转换后返回转换后的list则分页出现异常,分页数据的total变成当前返回数据list的size,页数始终为1
1 2 3 4
   | PageHelper.startPage(1, 10); List<Data> datas = dataService.finddataList();
  return new PageInfo<>(dataList);
   | 
 
问题排查
【第一步】:分页查询
分页查询的时候,得到的datas是一个特殊的ArrayList,Page对象,在源码中可以看到
1 2 3
   | public class Page<E> extends ArrayList<E> implements Closeable {
  }
  | 
 
【第二步】:返回PageInfo对象 在返回PageInfo对象的时候,源码中会做如下判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
   | public PageInfo(List list, int navigatePages) {     super(list);     this.isFirstPage = false;     this.isLastPage = false;     this.hasPreviousPage = false;     this.hasNextPage = false;     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 = 0L;             this.endRow = 0L;         } else {             this.startRow = page.getStartRow() + 1L;             this.endRow = this.startRow - 1L + (long) 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 = 0L;         this.endRow = list.size() > 0 ? (long) (list.size() - 1) : 0L;     }     if (list instanceof Collection) {         this.calcByNavigatePages(navigatePages);     } }
  | 
 
【结论】由于使用stream和类型转换之后对被象收集为了普通的ArrayList对象,并不是Page对象,所以在第二步返回时被判定为非page对象,被当做一个普通的ArrayList设置了pageNum(写死为第一页了)、total等,所以分页就失效了 stream把可正常分页的Page对象(ArrayList的子对象),转换成了不能分页的ArrayList对象
解决方法
1 2 3 4 5 6 7 8 9 10
   | Page<MessageVo> messageVos = new Page<>();   BeanUtils.copyProperties(messages, messageVos); messages.forEach(n -> {      MessageVo nVo = new MessageVo();  nVo.setType(n.getType());      nVo.setTitle(n.getTitle());   ....      messageVos.add(nVo);  });  PageInfo<MessageVo> pageInfo = new PageInfo<>(messageVos);   return pageInfo;
   | 
 
- 首先新建一个Page对象;
 
- 将分页查询出来的分页属性结果拷贝进Page中;
 
- 增强 for 设置视图属性;
 
- 将视图结果放入PageInfo;