使用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;