多表单独查询组合结果的自定义分页实现(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);
结束,也可传入多条件查询,以上更多提供一种解决的思路。如有帮助,幸甚。