##场景:查询一个列表a 列表a是从mysql获取,但后续需要对a立面每一个元素处理变为b,但将生成好的b列表放入new PageInfo<>(b)分页失效
PageHelper.startPage(pageNum, pageSize);
List<A> aList = ADao.queryList();
List<B> bList = process(aList);
new PageInfo<>(bList );
分析
从new PageInfo<>(bList);方法进入源码可以看到立面的代码,我们的数据经过函数处理产生的List会进入下面的if方法
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;
}
这也就是分页失效的原因,
为啥aList可以,分析PageInterceptor源码
这个方法将在query执行
这里进行结果处理
@Override
public Object afterPage(List pageList, Object parameterObject, RowBounds rowBounds) {
Page page = getLocalPage();
if (page == null) {
return pageList;
}
page.addAll(pageList);
if (!page.isCount()) {
page.setTotal(-1);
} else if ((page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0) {
page.setTotal(pageList.size());
} else if (page.isOrderByOnly()) {
page.setTotal(pageList.size());
}
return page;
}
最终返回对象是page对象
Page父类就是ArrayList 所以可以用List接受分页结果
解决方案
Page中的数据存储在List数组中,分页信息没变,所以只用替换数组中数据即可
Page aPage = null;
if (aList instanceof Page) {
aPage = (Page) aList ;
}
aPage .clear();
List<B> bList = process(aList);
aPage .addAll(bList );
return new PageInfo<>(aPage );