手动分页解决一对多查询使用pagehelper分页插件查询总条数不对的问题

一.前言

最近使用mybatis分页插件时,mapper.xml文件中sql语句面对一对多查询时,特别是结果封装集合中有封装多个数组对象时,结果总数total和每页显示数都会错误的将数组对象中的个数也统计进来了,导致出现错误的条数

二.解决办法

1.手动分页,这里推荐大家一个工具类

package com.gcs.util;

import java.util.ArrayList;
import java.util.List;

public class PageUtil {
    /**
     * 手动分页类
     * @param datas
     * @param pageSize
     * @param pageNo
     * @param <T>
     * @return
     */
    public static <T> List<T> getPageSizeDataForRelations(List<T> datas, int pageSize, int pageNo){
        int startNum = (pageNo-1)* pageSize+1 ;                     //起始截取数据位置
        if(startNum > datas.size()){
            return null;
        }
        List<T> res = new ArrayList<>();
        int rum = datas.size() - startNum;
        if(rum < 0){
            return null;
        }
        if(rum == 0){                                               //说明正好是最后一个了
            int index = datas.size() -1;
            res.add(datas.get(index));
            return res;
        }
        if(rum / pageSize >= 1){                                    //剩下的数据还够1页,返回整页的数据
            for(int i=startNum;i<startNum + pageSize;i++){          //截取从startNum开始的数据
                res.add(datas.get(i-1));
            }
            return res;
        }else if((rum / pageSize == 0) && rum > 0){                 //不够一页,直接返回剩下数据
            for(int j = startNum ;j<=datas.size();j++){
                res.add(datas.get(j-1));
            }
            return res;
        }else{
            return null;
        }
    }

}

Controller层手动设置分页参数:

//获取结果集
List<Instructions> list = service.getInstList(userId, taskId, type, status, instName, condition);
//使用工具类得到分页后的结果集
        List<Instructions> data = PageUtil.getPageSizeDataForRelations(list, pageSize, pageIndex);
        Map<String,Object> map = new HashMap<>();
        int size = list.size();//总条数
        //总页数
        int totlePage = size/pageSize;//取整
        int i = size % pageSize;//取余
        if(i > 0){
           totlePage+=1;
        }
        map.put("data",data);//结果集
        map.put("pages",totlePage);//总页数
        map.put("pageNum",pageIndex);//页码
        map.put("pageSize",pageSize);//每页显示条数
        map.put("total",size);//总条数
        return Result.success(map);

这种方法能解决大多数分页遇到的问题

2.sql语句改写
之前是一个查询比如应该只有一条记录,然后将结果集封装,但是在查询时分页插件会错误的统计为3条数据,而实际只展示一条数据
在这里插入图片描述
先查主表,然后查分表,再将分表的数据封装进来,由一条sql变成3条来查询,当然也可以从业务逻辑来改变,多几个方法,单表查询后封装数据.

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值