使用Github的PageHelper對list進行手動分頁


在項目中遇到復雜查詢的多樣化排序需求,由於得分規則復雜需要臨時匯總列表展示的分數...所以分數無法在sql內直接查詢得出(復雜計算,並不只是簡單的sum求和)

排序需求包含如下:

排序類型:0默認排序,1提交時間升序,2提交時間降序,3成績升序,4成績降序,5討論數降序

其中成績的排序,上述無法直接sql計算拿到,即無法在分頁查詢過程中去做,此時只能查出全部再手動分頁。

代碼段如下:

if (manualPage.contains(order) && pn != null && ps != null) {// 按成績排序時查全部,重新排序和分頁
	List<StudentGroupHomeworkDTO> newList;
	if (order == 3) {
		newList = list.stream().sorted(Comparator.comparing(StudentGroupHomeworkDTO::getScore, Comparator.nullsFirst(BigDecimal::compareTo))).collect(Collectors.toList());
	} else {
		newList = list.stream().sorted(Comparator.comparing(StudentGroupHomeworkDTO::getScore, Comparator.nullsFirst(BigDecimal::compareTo)).reversed()).collect(Collectors.toList());
	}
  	//創建Page類
	Page<StudentGroupHomeworkDTO> page = new Page<>(pn, ps);
	//為Page類中的total屬性賦值
  	int total = newList.size();
	page.setTotal(total);
  	//計算當前需要顯示的數據下標起始值
	int startIndex = (pn - 1) * ps;
	int endIndex = Math.min(startIndex + ps, total);
	//從鏈表中截取需要顯示的子鏈表,並加入到Page
	page.addAll(newList.subList(startIndex, endIndex));
  	//以Page創建PageInfo
	PageInfo<StudentGroupHomeworkDTO> pageInfo = new PageInfo<>(page);
	return pageInfo.getList();
}

按成績升序/降序時,踩了屬性為空導致Comparator.comparing()方法報錯了,之前也出現過類似問題,換成了Set排序......

今天打破砂鍋問到底,看到有說必須重寫Comparator.comparing()的博客,但是如果不為空可以不重寫也能正常排序出結果,糾結了一下看有沒有更好的方法。查找追溯到stream.sorted源碼,發現有Comparator.nullsFirst和Comparator.nullsLast方法:

方法 注釋
Comparator.nullsFirst 排序字段為null的對象放在排序后的List最后面
Comparator.nullsLast 排序字段為null的對象放在排序后的List最前面

使用nullsFirst方法完美解決!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM