TK-MyBatis 分頁查詢的具體使用

記 tkMybatis 查詢出一個  List集合 該集合已經做好瞭一層分頁Page封裝 即查詢出的list 使用類型判斷 instanceof Page 為true
但是,中途不明白這是一個帶分頁的集合,把查詢出的結果集又做瞭一層封裝 需要返回的對象類型為GoodsCategoryDTO,代碼如下: 

   // 商品集合
             List<GoodsCategoryDTO> goodsCategorys  = goodsLists.stream().map(x->{
            GoodsCategoryDTO goodsDTO = new GoodsCategoryDTO();
            goodsDTO.setGoodsId(x.getGoodsId());
            // 價格,名字
            if(x.getPriceInfo().getPriceValue() == null && x.getPriceInfo().getPriceType() == null){
                goodsDTO.setOriginalPrice(x.getPriceInfo().getOriginalPrice());
            }else {
                goodsDTO.setOriginalPrice(x.getPriceInfo().getOriginalPrice());
                goodsDTO.setPrice(x.getPriceInfo().getPriceValue() == null ?  new BigDecimal(""): x.getPriceInfo().getPriceValue());
                goodsDTO.setGoodsLable(x.getPriceInfo().getPriceName());
            }
            goodsDTO.setTitle(x.getGoodsName());
            goodsDTO.setSubTitle(x.getGoodsSubname());
            goodsDTO.setImg(x.getGoodsImage());
            goodsDTO.setSkuId(x.getSkuId());
            return goodsDTO;
        }).collect(Collectors.toList());
         return goodsCategorys;

從字面意思上理解 沒有問題 返回一個需要出裡商品的集合 在controller裡面做分頁的時候new 一個PageInfo 把該集合傳入 代碼如下:

 PageHelper.startPage(goodsParam.getPage(), goodsParam.getSize());  //  設置分頁值
        // 返回值
         List<GoodsCategoryDTO> goodsCategoryDTO = goodsService.getGoodsCategoryInfo(goodsParam);
         PageInfo<GoodsCategoryDTO> pageInfo = new PageInfo<>(goodsCategoryDTO);
         return ResultGenerator.genSuccessResult("返回數據成功", pageInfo);

但是萬萬沒有想到,在創建分頁對象PageInfo過程中 goodsCategoryDTO這個集合來判斷分頁形式,然後根據page 獲取當前頁pageNum和pageSize和pageTotal,但是如果goodsCategoryDTO 使用instanceof 判斷一直是Collection 無法分頁。

public PageInfo(List<T> list, int navigatePages) {
        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();
            //由於結果是>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.list = list;
            this.size = list.size();
            this.total = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //計算導航頁
            calcNavigatepageNums();
            //計算前後頁,第一頁,最後一頁
            calcPage();
            //判斷頁面邊界
            judgePageBoudary();
        }
    }

想瞭一下 使用如下的解決辦法可能會好一點 直接new 一個新的Page對象 獲取新的pageNum pageSize Total 然後賦值給該對象 ,然後遍歷集合中goodsList 然後做二次封裝 添加到 page集合 最後返回該集合即可。

 /**
     * 查詢分類商品信息
     * @param goodsParam
     * @return
     */
    public List<GoodsCategoryDTO> getGoodsCategoryInfo (GoodsParam goodsParam){
 
         // 查詢出已經實現和封裝好的Page的list
         List<GoodsDTO> goodsLists = queryGoodsByCat(goodsParam);
 
         if (goodsLists instanceof Page<?>) {
             Page<GoodsDTO> goodsPage = (Page<GoodsDTO>) goodsLists;
             return new Page<GoodsCategoryDTO>() {{
                 this.setPageNum(goodsPage.getPageNum());
                 this.setPageSize(goodsPage.getPageSize());
                 this.setTotal(goodsPage.getTotal());
                 this.setPages(goodsPage.getPages());
                 this.addAll(goodsPage.stream().map(goods -> new GoodsCategoryDTO() {{
                     this.setGoodsId(goods.getGoodsId());
                     this.setTitle(goods.getGoodsName());
                     this.setSubTitle(goods.getGoodsSubname());
                     this.setImg(goods.getGoodsImage());
                     this.setSkuId(goods.getSkuId());
                     if(goods.getPriceInfo().getPriceValue() == null && goods.getPriceInfo().getPriceType() == null){
                         this.setOriginalPrice(goods.getPriceInfo().getOriginalPrice());
                     }else {
                         this.setOriginalPrice(goods.getPriceInfo().getOriginalPrice());
                         this.setPrice(goods.getPriceInfo().getPriceValue() == null ?  new BigDecimal(""): goods.getPriceInfo().getPriceValue());
                         this.setGoodsLable(goods.getPriceInfo().getPriceName());
                     }
                 }}).collect(Collectors.toList()));
             }};
         } else {
             throw new IllegalStateException("goods list must be instance of Page");
         }
    }

到此這篇關於TK-MyBatis 分頁查詢的具體使用的文章就介紹到這瞭,更多相關TK-MyBatis 分頁查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: