PageIntercep分页替换内部对象

文章讨论了如何在使用MySql查询后,对查询结果的List进行处理并保持分页功能。作者发现PageHelper的分页失效源于处理后的List不再是Page对象,通过创建新的Page对象并填充处理后的数据,解决了分页问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##场景:查询一个列表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 );
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值