PageHelper.startPage分頁的使用和pageSize的值和list相同導致迴圈出來的total總數不對
阿新 • • 發佈:2021-05-20
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.直接呼叫就可以了
如果有說的不對的地方 還請各位大佬多多指教