美文网首页
分页插件PageHelper踩坑

分页插件PageHelper踩坑

作者: wang_cheng | 来源:发表于2020-08-11 11:42 被阅读0次

    日常踩坑

    测试说这个分页总条数total不对,总是等于传入的pageSize大小,一脸懵逼,看下库里确实不止这些数量

    开始看代码....
    一直不相信这种简单的操作代码有问题....

    说明:就是一个列表查询,返回的时候需要拿到数据进行一些转换封装另外一个对象返回出去

    看上去一切很正常的操作,能看出问题吗?

           //1.开启分页
             PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());
    
            //2.查数据
            List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example);
    
            PageInfo<TGmShoesCardExchangePurchaseRecord> pageInfo = new PageInfo<>(list);
            //3.查到数据进行转换封装返回
            List<CardExchangePurchaseDTO> collect = list.stream().map(record -> {
                CardExchangePurchaseDTO info = new CardExchangePurchaseDTO();
                BeanUtils.copyProperties(record, info);
                JSONObject jsonObject = JSON.parseObject((String) record.getSnapShot());
                info.setExchangeTime(record.getCreateTime().getTime());
                info.setSkuValue(jsonObject.getString("skuValue"));
                info.setReceiverName(jsonObject.getString("receiverName"));
                info.setReceiverPhone(jsonObject.getString("receiverPhone"));
                info.setAddress(jsonObject.getString("address"));
                return info;
            }).collect(Collectors.toList());
    
            //4.返回数据
            return new PageInfo<>(collect);
    
    

    看出来了吗?

    开启分页的时候是对数据层对象进行查询然后会返回一个Page对象,这个page设置了一些分页的属性
    Page<Object> page = PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());

    查询数据库
    List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example)
    如果不转换的话,应该是将这个查到的对象直接放到PageInfo构造器中返回
    return new PageInfo<>(list)

    看下new PageInfo()构造函数源码

    
     public PageInfo(List<T> list) {
            this(list, 8);
        }
    
    //看下this方法
    public PageInfo(List<T> list, int navigatePages) {
            this.isFirstPage = false;
            this.isLastPage = false;
            this.hasPreviousPage = false;
            this.hasNextPage = false;
    
          //重点,如果list是属于Page对象,那分页信息从这个Page对象里获取,没问题的
            if (list instanceof Page) {
                Page page = (Page)list;
                this.pageNum = page.getPageNum();
                this.pageSize = page.getPageSize();
                this.pages = page.getPages();
                this.list = page;
                this.size = page.size();
                this.total = page.getTotal();
                if (this.size == 0) {
                    this.startRow = 0;
                    this.endRow = 0;
                } else {
                    this.startRow = page.getStartRow() + 1;
                    this.endRow = this.startRow - 1 + this.size;
                }
          //这里,如果是新建的一个List(因为我进行数据转换,这个List是新建的属于Collection),所以分页属性
        //直接以list.size()去进行判断,看this.total=list.size(); 并不是数据库的实际总条数
            } else if (list instanceof Collection) {
                this.pageNum = 1;
                this.pageSize = list.size();
                this.pages = this.pageSize > 0 ? 1 : 0;
                this.list = list;
                this.size = list.size();
                this.total = (long)list.size();
                this.startRow = 0;
                this.endRow = list.size() > 0 ? list.size() - 1 : 0;
            }
    
            if (list instanceof Collection) {
                this.navigatePages = navigatePages;
                this.calcNavigatepageNums();
                this.calcPage();
                this.judgePageBoudary();
            }
    
        }
    

    那一般我们需要拿到数据还需要进行处理,这里只针对不对数据进行过滤筛选,只转换,可以进行重新设值

      PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());
    
            List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example);
    
        
            //这边先组装PageInfo
            PageInfo<TGmShoesCardExchangePurchaseRecord> pageInfo = new PageInfo<>(list);
    
            List<CardExchangePurchaseDTO> collect = list.stream().map(record -> {
                CardExchangePurchaseDTO info = new CardExchangePurchaseDTO();
                BeanUtils.copyProperties(record, info);
                JSONObject jsonObject = JSON.parseObject((String) record.getSnapShot());
                info.setExchangeTime(record.getCreateTime().getTime());
                info.setSkuValue(jsonObject.getString("skuValue"));
                info.setReceiverName(jsonObject.getString("receiverName"));
                info.setReceiverPhone(jsonObject.getString("receiverPhone"));
                info.setAddress(jsonObject.getString("address"));
                return info;
            }).collect(Collectors.toList());
    
            //踩坑,分页后数据要组装转换,分页信息需要重新设置,不然会导致总页数=list.size()
            //将需要转换封装的类new一个出来,下面进行属性copy重新设值
            PageInfo<CardExchangePurchaseDTO> page = new PageInfo<>(collect);
            BeanUtils.copyProperties(pageInfo,page);
            page.setList(collect);
            return page;
    
    

    相关文章

      网友评论

          本文标题:分页插件PageHelper踩坑

          本文链接:https://www.haomeiwen.com/subject/vybedktx.html