多表單獨查詢組合結果的自定義分頁實現(java代碼)
一、業務需求:
遇到一個業務,需要多個表進行分頁查詢,使用union聯合查詢時,速度極其緩慢,即使查詢的字段添加了索引,union查詢好像不走索引,因此聯合查詢無法滿足需求。
二、解決思路:
想到一個解決方案,多個表進行單獨查詢(表查詢字段添加索引就會快很多),根據分頁參數查詢需要的表中的數據,其他的表僅僅查詢滿足條件的數量值count返回累加,作為total分頁使用。
三、代碼實現:(純手寫)
PageInfopageInfo = null;
//1、根據查詢時間獲取存在的表
ListreList = getExitTablesByTime(startTime,endTime);
if(reList.isEmpty()){
return "不存在數據!";
}
PageCondition pageCondition = abcQuery.getPageCondition();
if(StringUtils.isEmpty(pageCondition)){
pageCondition = new PageCondition();
}
Integer pageSize = pageCondition.getPageSize();
Integer pageNum = pageCondition.getPageNumber();
Integer totalSize = pageSize;
Integer total = 0;
Integer startNum = pageCondition.getOffset();
Integer temp = pageSize*pageNum;
// abcQuery.setOrderBy("a.created desc");
/**
* 2、根據分頁入參和表中數據的數量 確定查詢的表
* 自定義查詢的總量和list內容,構建pageInfo
*/
List list = new ArrayList();
String all_sql = " id, ....., " +
" .......... creator, modifier, " +
" status, created, modified ";
String count = " count(0) ";
for (int i = reList.size()-1; i >=0 ; i--) {
String tableName = reList.get(i);
String countsql = "select "+ count +" FROM "+ tableName +" a";
abcQuery.setUnitSql(countsql);
Integer tabletotal = abcMapper.findCount(abcQuery);
total += tabletotal;
if(list.size() == totalSize){
continue;
}
String listsql = "select "+ all_sql +" FROM "+ tableName +" a";
abcQuery.setUnitSql(listsql);
//一張表數據滿足條件。
if(temp <= tabletotal){
abcQuery.setStartNum(startNum);
abcQuery.setPageSize(pageSize);
List templist = abcMapper.findList(abcQuery);
list.addAll(templist);
continue;
}
//一張表有部分數據滿足條件。
if(startNum < tabletotal){
abcQuery.setStartNum(startNum);
abcQuery.setPageSize(pageSize);
List templist = abcMapper.findList(abcQuery);
list.addAll(templist);
startNum = startNum-tabletotal<0 ? 0 : startNum-tabletotal;
pageSize = pageSize - templist.size();
temp = startNum + pageSize;
continue;
}
//一張表沒有數據滿足條件。
if(startNum >= tabletotal){
startNum = startNum-tabletotal;
temp = startNum + pageSize;
continue;
}
}
pageInfo = new PageInfo(list);
pageInfo.setPageNum(pageNum);
pageInfo.setTotal(total);
結束,也可傳入多條件查詢,以上更多提供一種解決的思路。如有幫助,幸甚。