首页 > 编程知识 正文

oracle分页查询出现重复的问题,pagehelper获取总页数

时间:2023-05-06 08:55:00 阅读:274117 作者:3520

PageHelper.startPage分页的使用和pageSize的值和list相同导致循环出来的total总数不对 /**CommonQo 是我自己定义的一个类 来存放pageNum和PageSize**/ @Override public PageInfo<FleetData> selectMarkAndSelfIdOne(CommonQo commonQo) {PageHelper.startPage(commonQo.getPageNum(),commonQo.getPageSize()); List<FleetData> fleetData = fleetDataMapper.selectMarkAndSelfIdOne(); //debug断点 PageInfo<FleetData> pageInfo = new PageInfo<>(fleetData); List<FleetData> fleetDataList = new ArrayList<>(); System.out.println(fleetData.size()); //for循环就循环5 for (FleetData fleetData2: fleetData) { Long userId= fleetData2.getId();//获得用户id //System.out.println("用户id======="+ userId ); List<FleetBill> fleetBills = fleetBillMapper.selectBySelfId(userId); if (fleetBills.size()>0){ for (FleetBill fleet:fleetBills) { Long userId1= fleet.getFleetId();//获得用户id //System.out.println("客户id======="+ userId1); } } else { fleetDataList.add(fleetData2); } }// PageInfo<FleetData> page= new PageInfo<>(fleetDataList);// BeanUtils.copyProperties(pageInfo,page); pageInfo.setList(fleetDataList); return pageInfo; }

1.PageHelper 是一个分页插件。需要传入参数,pageNum,pageSize如果你传入的参数分别是10,5,表示第10页,每页5条数据。那么 fleetDataMapper.selectMarkAndSelfIdOne();的sql 末尾会默认加上limit 50,5,也就是查询结果最多返回5条数据。

//未分页select * from marker//分页后select * from marker limit 50,5

2.那么问题就来了
我需要的是把所有的东西查出来之后进行for循环处理把我需要的数据存放到一个新的list集合里然后再去分页

PageHelper.startPage(commonQo.getPageNum(),commonQo.getPageSize());List<FleetData> fleetData = fleetDataMapper.selectMarkAndSelfIdOne();

应为PageHelper.startPage是直接操作数据库的,所以他在这里提前做了分页 如果pageSize是5 那么他就会直接去数据库查5条数据 然后返回给你 最后导致for循环的次数不对 然后影响下边的数据处理 导致最后返回的数据total总数不对

3.解决方法
定义一个list分页工具
等所有的东西处理完之后直接对list做分页

/** * 自定义List分页工具 * @author hanwl */public class PageUtil { //页数 private Integer lastPage; //一共有多少条数据 private Integer count; //页码 private Integer pageNum; //每页多少条数据 private Integer pageSize; public Integer getLastPage() { return lastPage; } public void setLastPage(Integer lastPage) { this.lastPage = lastPage; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public Integer getPageNum() { return pageNum; } public void setPageNum(Integer pageNum) { this.pageNum = pageNum; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } /** * 开始分页 * @param list * @param pageNum 页码 * @param pageSize 每页多少条数据 * @return */ public List startPage(List list, Integer pageNum, Integer pageSize) { if (list == null) { return null; } if (list.size() == 0) { return null; } count = list.size(); // 记录总数 lastPage = 0; // 页数 if (count % pageSize == 0) { lastPage = count / pageSize; } else { lastPage = count / pageSize + 1; } int fromIndex = 0; // 开始索引 int toIndex = 0; // 结束索引 if (pageNum != lastPage) { fromIndex = (pageNum - 1) * pageSize; toIndex = fromIndex + pageSize; } else { fromIndex = (pageNum - 1) * pageSize; toIndex = count; } this.pageNum = pageNum; this.pageSize = pageSize; List pageList = list.subList(fromIndex, toIndex); return pageList; }}

4.直接调用就可以了

如果有说的不对的地方 还请各位大佬多多指教

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。