日常踩坑
測(cè)試說(shuō)這個(gè)分頁(yè)總條數(shù)total不對(duì),總是等于傳入的pageSize大小,一臉懵逼,看下庫(kù)里確實(shí)不止這些數(shù)量
開始看代碼....
一直不相信這種簡(jiǎn)單的操作代碼有問(wèn)題....
說(shuō)明:就是一個(gè)列表查詢,返回的時(shí)候需要拿到數(shù)據(jù)進(jìn)行一些轉(zhuǎn)換封裝另外一個(gè)對(duì)象返回出去
看上去一切很正常的操作,能看出問(wèn)題嗎?
//1.開啟分頁(yè)
PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());
//2.查數(shù)據(jù)
List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example);
PageInfo<TGmShoesCardExchangePurchaseRecord> pageInfo = new PageInfo<>(list);
//3.查到數(shù)據(jù)進(jìn)行轉(zhuǎn)換封裝返回
List<CardExchangePurchaseDTO> collect = list.stream().map(record -> {
CardExchangePurchaseDTO info = new CardExchangePurchaseDTO();
BeanUtils.copyProperties(record, info);
JSONObject jsonObject = JSON.parseObject((String) record.getSnapShot());
info.setExchangeTime(record.getCreateTime().getTime());
info.setSkuValue(jsonObject.getString("skuValue"));
info.setReceiverName(jsonObject.getString("receiverName"));
info.setReceiverPhone(jsonObject.getString("receiverPhone"));
info.setAddress(jsonObject.getString("address"));
return info;
}).collect(Collectors.toList());
//4.返回?cái)?shù)據(jù)
return new PageInfo<>(collect);
看出來(lái)了嗎?
開啟分頁(yè)的時(shí)候是對(duì)數(shù)據(jù)層對(duì)象進(jìn)行查詢?nèi)缓髸?huì)返回一個(gè)Page對(duì)象,這個(gè)page設(shè)置了一些分頁(yè)的屬性
Page<Object> page = PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());
查詢數(shù)據(jù)庫(kù)
List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example)
如果不轉(zhuǎn)換的話,應(yīng)該是將這個(gè)查到的對(duì)象直接放到PageInfo構(gòu)造器中返回
return new PageInfo<>(list)
看下new PageInfo()
構(gòu)造函數(shù)源碼
public PageInfo(List<T> list) {
this(list, 8);
}
//看下this方法
public PageInfo(List<T> list, int navigatePages) {
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
//重點(diǎn),如果list是屬于Page對(duì)象,那分頁(yè)信息從這個(gè)Page對(duì)象里獲取,沒(méi)問(wèn)題的
if (list instanceof Page) {
Page page = (Page)list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
this.total = page.getTotal();
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
this.endRow = this.startRow - 1 + this.size;
}
//這里,如果是新建的一個(gè)List(因?yàn)槲疫M(jìn)行數(shù)據(jù)轉(zhuǎn)換,這個(gè)List是新建的屬于Collection),所以分頁(yè)屬性
//直接以list.size()去進(jìn)行判斷,看this.total=list.size(); 并不是數(shù)據(jù)庫(kù)的實(shí)際總條數(shù)
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.list = list;
this.size = list.size();
this.total = (long)list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
this.calcNavigatepageNums();
this.calcPage();
this.judgePageBoudary();
}
}
那一般我們需要拿到數(shù)據(jù)還需要進(jìn)行處理,這里只針對(duì)不對(duì)數(shù)據(jù)進(jìn)行過(guò)濾篩選,只轉(zhuǎn)換,可以進(jìn)行重新設(shè)值
PageHelper.startPage(purchase.getPageNum(), purchase.getPageSize());
List<TGmShoesCardExchangePurchaseRecord> list = tGmShoesCardExchangePurchaseRecordMapper.selectByExample(example);
//這邊先組裝PageInfo
PageInfo<TGmShoesCardExchangePurchaseRecord> pageInfo = new PageInfo<>(list);
List<CardExchangePurchaseDTO> collect = list.stream().map(record -> {
CardExchangePurchaseDTO info = new CardExchangePurchaseDTO();
BeanUtils.copyProperties(record, info);
JSONObject jsonObject = JSON.parseObject((String) record.getSnapShot());
info.setExchangeTime(record.getCreateTime().getTime());
info.setSkuValue(jsonObject.getString("skuValue"));
info.setReceiverName(jsonObject.getString("receiverName"));
info.setReceiverPhone(jsonObject.getString("receiverPhone"));
info.setAddress(jsonObject.getString("address"));
return info;
}).collect(Collectors.toList());
//踩坑,分頁(yè)后數(shù)據(jù)要組裝轉(zhuǎn)換,分頁(yè)信息需要重新設(shè)置,不然會(huì)導(dǎo)致總頁(yè)數(shù)=list.size()
//將需要轉(zhuǎn)換封裝的類new一個(gè)出來(lái),下面進(jìn)行屬性copy重新設(shè)值
PageInfo<CardExchangePurchaseDTO> page = new PageInfo<>(collect);
BeanUtils.copyProperties(pageInfo,page);
page.setList(collect);
return page;