一.前言
最近使用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条来查询,当然也可以从业务逻辑来改变,多几个方法,单表查询后封装数据.