mybatis操作分页之后数据丢失问题(若依)
前言:
我们知道在使用PageHelper分页插件时,会执行PageHelper.startPage(pageNum,pageSize);方法后的第一条查询语句就会被指定分页操作。但是在开发过程中总会遇到这样的业务场景,在进行分页查询后,我们需要将查询到的列表数据封装成另外一种类型进行返回,此时需要对新类型的列表数据进行分页,然而因为PageInfo中泛型的原因,导致分页之后出现数据的丢失问题;
原因:
就是因为执行分页后的第一个查询语句返回的类型与最终返回的类型不一致,从而导致最终分页之后的数据出现丢失或不准确的情况!
PageHelper.startPage()详解:
PageHelper.startPage();这个方法说的是我要开始分页了哈,全部数据听我号令,没错,这个东东就是干这个的,并且还很挑位置,他就喜欢在最开始的位置,你放错位置你的结果就不是你想要的了,我要说的重点是假如你确定要使用这个方法了,那就善始善终,用完它,不然的话,哼哼,你会发现你代码里所有的查询方法都会出现问题,不管是有分页还是没分页,都会出现数据要么正常,要么就少了,然后就和我一样,还不知道哪里出问题了,心累
划重点:在你使用PageHelper.startPage(),但是在执行完.startPage()后,没有查询数据库操作,并且此次查询请求响应结束,线程空闲时,又有新的别的查询请求进来,此时线程复用,myBaits通过自身的拦截器拦截,导致给新的查询自动添加了Limit?,?,从而报错,没错就是这个问题,用我的话说就是,你既然选择我了,就要对我有始有终,不然后果自负。
解决办法:
一、查询完数据之后,使用PageInfo<泛型>对象,将查询到的数据进行分页设置,得到分页对象pageInfo1;之后当我们得到返回数据类型的所有数据时,我们仍然使用PageInfo<泛型>,对数据进行分页设置,得到分页信息pageInfo2;其次将第一次得到的分页信息pageInfo1赋值到第二次得到的分页信息中pageInfo2,然后再将所要返回的数据集合设置到pageInfo2中,然后就可以对分页数据进行返回了;这样返回的数据就不会产生数据的丢失了。
package com.ruoyi.common.utils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.page.TableDataInfo;
import java.util.List;
public class PaginationUtil {
public static <T> TableDataInfo getPageInfo(List list, Integer currentPage, Integer pageSize) {
int total = list.size();
if (total > pageSize) {
int toIndex = pageSize * currentPage;
if (toIndex > total) {
toIndex = total;
}
list = list.subList(pageSize * (currentPage - 1), toIndex);
}
Page<T> page = new Page<>(currentPage, pageSize);
page.addAll(list);
page.setPages((total + pageSize - 1) / pageSize);
page.setTotal(total);
PageInfo<T> pageInfo = new PageInfo<>(page);
TableDataInfo rspData = new TableDataInfo();
rspData.setRows(list);
rspData.setTotal(pageInfo.getTotal());
return rspData;
}
}
/**
* 查询笼号分配列表
*/
@PreAuthorize("@ss.hasPermi('animal:allocation:list')")
@GetMapping("/list")
public TableDataInfo list(AnimalCageAllocation animalCageAllocation)
{
// startPage();
//删除startPage()方法并重写出来,为了获取pageNum、pageSize
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
List<AnimalCageAllocationEx> list = animalCageAllocationService.selectAnimalCageAllocationExList(animalCageAllocation);
// return getDataTable(list);
//使用工具类进行处理结果集,直接返回
TableDataInfo pageInfo = PaginationUtil.getPageInfo(list, pageNum, pageSize);
return pageInfo;
}
参考:https://blog.csdn.net/qq_61920623/article/details/133928353