解决PageHelper.startPage(page, size)后total和PageSize总是相等的问题 您所在的位置:网站首页 pages导出为word后少了一页 解决PageHelper.startPage(page, size)后total和PageSize总是相等的问题

解决PageHelper.startPage(page, size)后total和PageSize总是相等的问题

2024-06-30 20:37| 来源: 网络整理| 查看: 265

很多人会使用PageHelper自动分页以后,对查出来的数据进行封装返回前端,却发现显示的数据数量和期待的不符,甚至总是和设定的PageSize相等,但是查阅了很多博客资料发现话只说一半,对于初学者来说不解决问题。今天就把问题彻底解决了。

一、问题 PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy()); //和数据库的第一次交互 List couponList = couponMapper.selectByExample(couponExample); //封装 List searchCouponResponseList = couponDao.getSearchCouponResponse(couponList, userId); //返回前端 return new PageInfo(searchCouponResponseList);

网上都说PageHelper.startPage后面一定要紧跟和数据库的交互的函数。这样他们就能拦截到第一次和数据库交互的数据并进行分页处理。这话是没错的,但是然后我根据我得到的list进行封装这个是很多业务必不可少的吧。但是封装后的数据却损失了很多属性,总共的数据量也丢失了。我们要解决这个问题那么首先我们就要知道为什么会这样。

二、原因

代码块一

public PageInfo(List list, int navigatePages) { super(list);//关键,代码块二展示了super内容 if (list instanceof Page) { //关键 Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages(); this.size = page.size(); //由于结果是>startRow的,所以实际的需要+1 if (this.size == 0) { this.startRow = 0; this.endRow = 0; } else { this.startRow = page.getStartRow() + 1; //计算实际的endRow(最后一页的时候特殊) 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; }

代码块二

//第一个构造函数有一个super(),这里是super的内容 public PageSerializable(List list) { this.list = list; if(list instanceof Page){ this.total = ((Page)list).getTotal(); } else { this.total = list.size(); } }

根据代码块一,稍有常识的人都能发现,我们传进来的List其实是一个Page,因此他需要判断一下传进来的list能不能转型成Page对象。为什么呢因为我们说了在第一次和数据库交互的时候,被拦截到进行了封装,那么返回给你的这部分数据是分页好的,并且保留了特定的信息,而这个过程就是把数据库搜索到的list封装成page的过程,也就是说

List couponList = couponMapper.selectByExample(couponExample);

这个couponList他不是真的List了,是一个Page类型。有兴趣的朋友打一个断点看看他是什么。 在这里插入图片描述 那么也就是说返回给我的list是已经分页好的,并且保存了所有的必要数据。那么我就想,我能不能自己创建一个PageInfo,我把必要的数据给他塞进去,但是呢list塞我封装好的数据,做一个狸猫换太子的操作

三、解决方法 public PageInfo(List list, int navigatePages) { super(list); if (list instanceof Page) { Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages();//共几页 this.size = page.size(); } public PageSerializable(List list) { this.list = list; if(list instanceof Page){ this.total = ((Page)list).getTotal(); } else { this.total = list.size(); } }

那么PageInfo 稍有常识的人就能发现,他需要pageNum, pageSize, pages, size, 和total。前两者是我们自定义的,后三者是第一次交互返回给我们的list的那个变量里就已经有的。 还有一个this.list = list把我们封装好的给他换进去不就好了?

四、结果 .....................省略 PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy()); List couponList = couponMapper.selectByExample(couponExample); //封装 List searchCouponResponseList = couponDao.getSearchCouponResponse(couponList, userId); PageInfo pageInfo = new PageInfo(); if(couponList instanceof com.github.pagehelper.Page) { pageInfo = buildPageInfo((com.github.pagehelper.Page) couponList);//把属性提取出来自己new一个pageInfo } pageInfo.setList(searchCouponResponseList); //再把我们封装好的塞进去,狸猫换太子 if(couponList.size() == 0) return new Page(new PageInfo(new ArrayList()));; return new Page(pageInfo); ....................省略 } private PageInfo buildPageInfo(com.github.pagehelper.Page pageList) { PageInfo pageInfo = new PageInfo(); pageInfo.setPageNum(pageList.getPageNum()); pageInfo.setPageSize(pageList.getPageSize()); pageInfo.setPages(pageList.getPages()); pageInfo.setTotal(pageList.getTotal()); return pageInfo; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有