mirror of https://github.com/jeecgboot/jeecg-boot
支持多字段默认排序defSort数组、解决多列排序无效 #8659
parent
83bb0a0a6a
commit
ead2cef1f4
|
@ -11,6 +11,7 @@ import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
import org.apache.commons.beanutils.PropertyUtils;
|
import org.apache.commons.beanutils.PropertyUtils;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.DataBaseConstant;
|
import org.jeecg.common.constant.DataBaseConstant;
|
||||||
|
@ -257,7 +258,68 @@ public class QueryGenerator {
|
||||||
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
||||||
order = parameterMap.get(ORDER_TYPE)[0];
|
order = parameterMap.get(ORDER_TYPE)[0];
|
||||||
}
|
}
|
||||||
log.debug("排序规则>>列:" + column + ",排序方式:" + order);
|
|
||||||
|
if(oConvertUtils.isNotEmpty(column)){
|
||||||
|
log.info("单字段排序规则>> column:" + column + ",排序方式:" + order);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. 列表多字段排序优先
|
||||||
|
if(parameterMap!=null&& parameterMap.containsKey("sortInfoString")) {
|
||||||
|
// 多字段排序
|
||||||
|
String sortInfoString = parameterMap.get("sortInfoString")[0];
|
||||||
|
log.info("多字段排序规则>> sortInfoString:" + sortInfoString);
|
||||||
|
List<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);
|
||||||
|
log.info(orderItemList.toString());
|
||||||
|
if (orderItemList != null && !orderItemList.isEmpty()) {
|
||||||
|
for (OrderItem item : orderItemList) {
|
||||||
|
// 一、获取排序数据库字段
|
||||||
|
String columnName = item.getColumn();
|
||||||
|
// 1.字典字段,去掉字典翻译文本后缀
|
||||||
|
if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
||||||
|
columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
||||||
|
}
|
||||||
|
// 2.实体驼峰字段转为数据库字段
|
||||||
|
columnName = SqlInjectionUtil.getSqlInjectSortField(columnName);
|
||||||
|
|
||||||
|
// 二、设置字段排序规则
|
||||||
|
if (item.isAsc()) {
|
||||||
|
queryWrapper.orderByAsc(columnName);
|
||||||
|
} else {
|
||||||
|
queryWrapper.orderByDesc(columnName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 列表单字段默认排序
|
||||||
|
if(oConvertUtils.isEmpty(column) && parameterMap!=null&& parameterMap.containsKey("defSortString")) {
|
||||||
|
// 多字段排序
|
||||||
|
String sortInfoString = parameterMap.get("defSortString")[0];
|
||||||
|
log.info("默认多字段排序规则>> defSortString:" + sortInfoString);
|
||||||
|
List<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);
|
||||||
|
log.info(orderItemList.toString());
|
||||||
|
if (orderItemList != null && !orderItemList.isEmpty()) {
|
||||||
|
for (OrderItem item : orderItemList) {
|
||||||
|
// 一、获取排序数据库字段
|
||||||
|
String columnName = item.getColumn();
|
||||||
|
// 1.字典字段,去掉字典翻译文本后缀
|
||||||
|
if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
||||||
|
columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
||||||
|
}
|
||||||
|
// 2.实体驼峰字段转为数据库字段
|
||||||
|
columnName = SqlInjectionUtil.getSqlInjectSortField(columnName);
|
||||||
|
|
||||||
|
// 二、设置字段排序规则
|
||||||
|
if (item.isAsc()) {
|
||||||
|
queryWrapper.orderByAsc(columnName);
|
||||||
|
} else {
|
||||||
|
queryWrapper.orderByDesc(columnName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//update-begin-author:scott date:2022-11-07 for:避免用户自定义表无默认字段{创建时间},导致排序报错
|
//update-begin-author:scott date:2022-11-07 for:避免用户自定义表无默认字段{创建时间},导致排序报错
|
||||||
//TODO 避免用户自定义表无默认字段创建时间,导致排序报错
|
//TODO 避免用户自定义表无默认字段创建时间,导致排序报错
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
package org.jeecg.common.system.util;
|
package org.jeecg.common.system.util;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.DataBaseConstant;
|
import org.jeecg.common.constant.DataBaseConstant;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.system.query.QueryGenerator;
|
||||||
import org.jeecg.common.system.query.QueryRuleEnum;
|
import org.jeecg.common.system.query.QueryRuleEnum;
|
||||||
import org.jeecg.common.util.CommonUtils;
|
import org.jeecg.common.util.CommonUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -240,4 +249,46 @@ public class SqlConcatUtil {
|
||||||
return CommonUtils.getDatabaseType();
|
return CommonUtils.getDatabaseType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前端传过来的 "多字段排序信息: sortInfoString"
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<OrderItem> getQueryConditionOrders(String column, String order, String queryInfoString){
|
||||||
|
List<OrderItem> list = new ArrayList<>();
|
||||||
|
if(oConvertUtils.isEmpty(queryInfoString)){
|
||||||
|
//默认以创建时间倒序查询
|
||||||
|
if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(order)){
|
||||||
|
list.add(OrderItem.desc(column));
|
||||||
|
}else{
|
||||||
|
list.add(OrderItem.asc(column));
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
// 【TV360X-967】URL解码(微服务下需要)
|
||||||
|
if (queryInfoString.contains("%22column%22")) {
|
||||||
|
log.info("queryInfoString 原生 = {}", queryInfoString);
|
||||||
|
try {
|
||||||
|
queryInfoString = URLDecoder.decode(queryInfoString, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new JeecgBootException(e);
|
||||||
|
}
|
||||||
|
log.info("queryInfoString 解码 = {}", queryInfoString);
|
||||||
|
}
|
||||||
|
JSONArray array = JSONArray.parseArray(queryInfoString);
|
||||||
|
Iterator it = array.iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
JSONObject json = (JSONObject)it.next();
|
||||||
|
String tempColumn = json.getString("column");
|
||||||
|
if(oConvertUtils.isNotEmpty(tempColumn)){
|
||||||
|
String tempOrder = json.getString("order");
|
||||||
|
if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(tempOrder)){
|
||||||
|
list.add(OrderItem.desc(tempColumn));
|
||||||
|
}else{
|
||||||
|
list.add(OrderItem.asc(tempColumn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue