update
This commit is contained in:
@@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.beanutils.PropertyUtils;
|
import org.apache.commons.beanutils.PropertyUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.DataBaseConstant;
|
import org.jeecg.common.constant.DataBaseConstant;
|
||||||
import org.jeecg.common.exception.JeecgBootException;
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
import org.jeecg.common.system.util.JeecgDataAutorUtils;
|
import org.jeecg.common.system.util.*;
|
||||||
import org.jeecg.common.system.util.JwtUtil;
|
|
||||||
import org.jeecg.common.system.util.SqlConcatUtil;
|
|
||||||
import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
|
import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
|
||||||
import org.jeecg.common.util.*;
|
import org.jeecg.common.util.*;
|
||||||
import org.springframework.util.NumberUtils;
|
import org.springframework.util.NumberUtils;
|
||||||
@@ -33,19 +32,19 @@ import java.util.stream.Collectors;
|
|||||||
public class QueryGenerator {
|
public class QueryGenerator {
|
||||||
public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN";
|
public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN";
|
||||||
|
|
||||||
private static final String BEGIN = "_begin";
|
private static final String BEGIN = "_begin";
|
||||||
private static final String END = "_end";
|
private static final String END = "_end";
|
||||||
/**
|
/**
|
||||||
* 数字类型字段,拼接此后缀 接受多值参数
|
* 数字类型字段,拼接此后缀 接受多值参数
|
||||||
*/
|
*/
|
||||||
private static final String MULTI = "_MultiString";
|
private static final String MULTI = "_MultiString";
|
||||||
private static final String STAR = "*";
|
private static final String STAR = "*";
|
||||||
private static final String COMMA = ",";
|
private static final String COMMA = ",";
|
||||||
/**
|
/**
|
||||||
* 查询 逗号转义符 相当于一个逗号【作废】
|
* 查询 逗号转义符 相当于一个逗号【作废】
|
||||||
*/
|
*/
|
||||||
public static final String QUERY_COMMA_ESCAPE = "++";
|
public static final String QUERY_COMMA_ESCAPE = "++";
|
||||||
private static final String NOT_EQUAL = "!";
|
private static final String NOT_EQUAL = "!";
|
||||||
/**
|
/**
|
||||||
* 页面带有规则值查询,空格作为分隔符
|
* 页面带有规则值查询,空格作为分隔符
|
||||||
*/
|
*/
|
||||||
@@ -53,7 +52,7 @@ public class QueryGenerator {
|
|||||||
/**
|
/**
|
||||||
* 高级查询前端传来的参数名
|
* 高级查询前端传来的参数名
|
||||||
*/
|
*/
|
||||||
private static final String SUPER_QUERY_PARAMS = "superQueryParams";
|
private static final String SUPER_QUERY_PARAMS = "superQueryParams";
|
||||||
/**
|
/**
|
||||||
* 高级查询前端传来的拼接方式参数名
|
* 高级查询前端传来的拼接方式参数名
|
||||||
*/
|
*/
|
||||||
@@ -61,16 +60,16 @@ public class QueryGenerator {
|
|||||||
/**
|
/**
|
||||||
* 单引号
|
* 单引号
|
||||||
*/
|
*/
|
||||||
public static final String SQL_SQ = "'";
|
public static final String SQL_SQ = "'";
|
||||||
/**
|
/**
|
||||||
* 排序列
|
* 排序列
|
||||||
*/
|
*/
|
||||||
private static final String ORDER_COLUMN = "column";
|
private static final String ORDER_COLUMN = "column";
|
||||||
/**
|
/**
|
||||||
* 排序方式
|
* 排序方式
|
||||||
*/
|
*/
|
||||||
private static final String ORDER_TYPE = "order";
|
private static final String ORDER_TYPE = "order";
|
||||||
private static final String ORDER_TYPE_ASC = "ASC";
|
private static final String ORDER_TYPE_ASC = "ASC";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mysql 模糊查询之特殊字符下划线 (_、\)
|
* mysql 模糊查询之特殊字符下划线 (_、\)
|
||||||
@@ -126,7 +125,8 @@ public class QueryGenerator {
|
|||||||
* @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum}
|
* @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum}
|
||||||
* @return QueryWrapper实例
|
* @return QueryWrapper实例
|
||||||
*/
|
*/
|
||||||
public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap) {
|
public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap,
|
||||||
|
Map<String, QueryRuleEnum> customRuleMap) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
|
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
|
||||||
installMplus(queryWrapper, searchObj, parameterMap, customRuleMap);
|
installMplus(queryWrapper, searchObj, parameterMap, customRuleMap);
|
||||||
@@ -144,7 +144,8 @@ public class QueryGenerator {
|
|||||||
* <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
|
* <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
|
||||||
* <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
|
* <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
|
||||||
*/
|
*/
|
||||||
private static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap) {
|
private static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap,
|
||||||
|
Map<String, QueryRuleEnum> customRuleMap) {
|
||||||
/*
|
/*
|
||||||
* 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
|
* 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
|
||||||
但是不支持在自定义SQL中写orgCode in #{sys_org_code}
|
但是不支持在自定义SQL中写orgCode in #{sys_org_code}
|
||||||
@@ -242,7 +243,6 @@ public class QueryGenerator {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 区间查询
|
* 区间查询
|
||||||
*
|
*
|
||||||
@@ -252,7 +252,8 @@ public class QueryGenerator {
|
|||||||
* @param filedName 字段名称
|
* @param filedName 字段名称
|
||||||
* @param columnName 列名称
|
* @param columnName 列名称
|
||||||
*/
|
*/
|
||||||
private static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName, String columnName) throws ParseException {
|
private static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName,
|
||||||
|
String columnName) throws ParseException {
|
||||||
// 添加 判断是否有区间值
|
// 添加 判断是否有区间值
|
||||||
String endValue = null, beginValue = null;
|
String endValue = null, beginValue = null;
|
||||||
if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) {
|
if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) {
|
||||||
@@ -271,7 +272,8 @@ public class QueryGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) {
|
private static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap,
|
||||||
|
Map<String, String> fieldColumnMap) {
|
||||||
Set<String> allFields = fieldColumnMap.keySet();
|
Set<String> allFields = fieldColumnMap.keySet();
|
||||||
String column = null, order = null;
|
String column = null, order = null;
|
||||||
if (parameterMap != null && parameterMap.containsKey(ORDER_COLUMN)) {
|
if (parameterMap != null && parameterMap.containsKey(ORDER_COLUMN)) {
|
||||||
@@ -367,7 +369,8 @@ public class QueryGenerator {
|
|||||||
private static void doSuperQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) {
|
private static void doSuperQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) {
|
||||||
if (parameterMap != null && parameterMap.containsKey(SUPER_QUERY_PARAMS)) {
|
if (parameterMap != null && parameterMap.containsKey(SUPER_QUERY_PARAMS)) {
|
||||||
String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];
|
String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];
|
||||||
String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0] : MatchTypeEnum.AND.getValue();
|
String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0]
|
||||||
|
: MatchTypeEnum.AND.getValue();
|
||||||
MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
|
MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
|
||||||
// update-begin--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 -------
|
// update-begin--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 -------
|
||||||
try {
|
try {
|
||||||
@@ -378,10 +381,8 @@ public class QueryGenerator {
|
|||||||
}
|
}
|
||||||
// update-begin-author:sunjianlei date:20220119 for: 【JTC-573】 过滤空条件查询,防止 sql 拼接多余的 and
|
// update-begin-author:sunjianlei date:20220119 for: 【JTC-573】 过滤空条件查询,防止 sql 拼接多余的 and
|
||||||
List<QueryCondition> filterConditions = conditions.stream().filter(
|
List<QueryCondition> filterConditions = conditions.stream().filter(
|
||||||
rule -> oConvertUtils.isNotEmpty(rule.getField())
|
rule -> oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule())
|
||||||
&& oConvertUtils.isNotEmpty(rule.getRule())
|
&& oConvertUtils.isNotEmpty(rule.getVal())).collect(Collectors.toList());
|
||||||
&& oConvertUtils.isNotEmpty(rule.getVal())
|
|
||||||
).collect(Collectors.toList());
|
|
||||||
if (filterConditions.size() == 0) {
|
if (filterConditions.size() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -391,8 +392,7 @@ public class QueryGenerator {
|
|||||||
queryWrapper.and(andWrapper -> {
|
queryWrapper.and(andWrapper -> {
|
||||||
for (int i = 0; i < filterConditions.size(); i++) {
|
for (int i = 0; i < filterConditions.size(); i++) {
|
||||||
QueryCondition rule = filterConditions.get(i);
|
QueryCondition rule = filterConditions.get(i);
|
||||||
if (oConvertUtils.isNotEmpty(rule.getField())
|
if (oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule())
|
||||||
&& oConvertUtils.isNotEmpty(rule.getRule())
|
|
||||||
&& oConvertUtils.isNotEmpty(rule.getVal())) {
|
&& oConvertUtils.isNotEmpty(rule.getVal())) {
|
||||||
|
|
||||||
log.debug("SuperQuery ==> " + rule.toString());
|
log.debug("SuperQuery ==> " + rule.toString());
|
||||||
@@ -438,7 +438,8 @@ public class QueryGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update-begin--author:sunjianlei date:20210702 for:【/issues/I3VR8E】高级查询没有类型转换,查询参数都是字符串类型 ----
|
// update-begin--author:sunjianlei date:20210702 for:【/issues/I3VR8E】高级查询没有类型转换,查询参数都是字符串类型 ----
|
||||||
addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue);
|
addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()),
|
||||||
|
queryValue);
|
||||||
//update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
|
//update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
|
||||||
|
|
||||||
// 如果拼接方式是OR,就拼接OR
|
// 如果拼接方式是OR,就拼接OR
|
||||||
@@ -563,11 +564,17 @@ public class QueryGenerator {
|
|||||||
//mysql 模糊查询之特殊字符下划线 (_、\)
|
//mysql 模糊查询之特殊字符下划线 (_、\)
|
||||||
value = specialStrConvert(value.toString());
|
value = specialStrConvert(value.toString());
|
||||||
} else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) {
|
} else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) {
|
||||||
value = val.substring(1);
|
value = val;
|
||||||
|
if (StringUtils.startsWith(val, "%")) {
|
||||||
|
value = val.substring(1);
|
||||||
|
}
|
||||||
//mysql 模糊查询之特殊字符下划线 (_、\)
|
//mysql 模糊查询之特殊字符下划线 (_、\)
|
||||||
value = specialStrConvert(value.toString());
|
value = specialStrConvert(value.toString());
|
||||||
} else if (rule == QueryRuleEnum.RIGHT_LIKE) {
|
} else if (rule == QueryRuleEnum.RIGHT_LIKE) {
|
||||||
value = val.substring(0, val.length() - 1);
|
value = val;
|
||||||
|
if (StringUtils.endsWith(val, "%")) {
|
||||||
|
value = val.substring(0, val.length() - 1);
|
||||||
|
}
|
||||||
//mysql 模糊查询之特殊字符下划线 (_、\)
|
//mysql 模糊查询之特殊字符下划线 (_、\)
|
||||||
value = specialStrConvert(value.toString());
|
value = specialStrConvert(value.toString());
|
||||||
} else if (rule == QueryRuleEnum.IN) {
|
} else if (rule == QueryRuleEnum.IN) {
|
||||||
@@ -587,7 +594,8 @@ public class QueryGenerator {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addQueryByRule(QueryWrapper<?> queryWrapper, String name, String type, String value, QueryRuleEnum rule) throws ParseException {
|
private static void addQueryByRule(QueryWrapper<?> queryWrapper, String name, String type, String value, QueryRuleEnum rule)
|
||||||
|
throws ParseException {
|
||||||
if (oConvertUtils.isNotEmpty(value)) {
|
if (oConvertUtils.isNotEmpty(value)) {
|
||||||
//update-begin--Author:sunjianlei Date:20220104 for:【JTC-409】修复逗号分割情况下没有转换类型,导致类型严格的数据库查询报错 -------------------
|
//update-begin--Author:sunjianlei Date:20220104 for:【JTC-409】修复逗号分割情况下没有转换类型,导致类型严格的数据库查询报错 -------------------
|
||||||
// 针对数字类型字段,多值查询
|
// 针对数字类型字段,多值查询
|
||||||
@@ -752,7 +760,7 @@ public class QueryGenerator {
|
|||||||
else if (value.getClass().isArray()) {
|
else if (value.getClass().isArray()) {
|
||||||
vals = (Object[]) value;
|
vals = (Object[]) value;
|
||||||
} else {
|
} else {
|
||||||
vals = new Object[]{value};
|
vals = new Object[] {value};
|
||||||
}
|
}
|
||||||
queryWrapper.and(j -> {
|
queryWrapper.and(j -> {
|
||||||
log.info("---查询过滤器,Query规则---field:{}, rule:{}, value:{}", nameFinal, "like", vals[0]);
|
log.info("---查询过滤器,Query规则---field:{}, rule:{}, value:{}", nameFinal, "like", vals[0]);
|
||||||
@@ -775,12 +783,10 @@ public class QueryGenerator {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static boolean judgedIsUselessField(String name) {
|
private static boolean judgedIsUselessField(String name) {
|
||||||
return "class".equals(name) || "ids".equals(name)
|
return "class".equals(name) || "ids".equals(name) || "page".equals(name) || "rows".equals(name) || "sort".equals(name)
|
||||||
|| "page".equals(name) || "rows".equals(name)
|
|| "order".equals(name);
|
||||||
|| "sort".equals(name) || "order".equals(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取请求对应的数据权限规则 TODO 相同列权限多个 有问题
|
* 获取请求对应的数据权限规则 TODO 相同列权限多个 有问题
|
||||||
*
|
*
|
||||||
@@ -811,7 +817,8 @@ public class QueryGenerator {
|
|||||||
return ruleMap;
|
return ruleMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper<?> queryWrapper) {
|
private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType,
|
||||||
|
QueryWrapper<?> queryWrapper) {
|
||||||
QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
|
QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
|
||||||
if (rule.equals(QueryRuleEnum.IN) && !propertyType.equals(String.class)) {
|
if (rule.equals(QueryRuleEnum.IN) && !propertyType.equals(String.class)) {
|
||||||
String[] values = dataRule.getRuleValue().split(",");
|
String[] values = dataRule.getRuleValue().split(",");
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ public class ExperimentController extends JeecgController<Experiment, IExperimen
|
|||||||
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
|
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
|
||||||
// 自定义duoXuan字段的查询规则为:LIKE_WITH_OR
|
// 自定义duoXuan字段的查询规则为:LIKE_WITH_OR
|
||||||
customeRuleMap.put("startDate", QueryRuleEnum.RIGHT_LIKE);
|
customeRuleMap.put("startDate", QueryRuleEnum.RIGHT_LIKE);
|
||||||
|
|
||||||
QueryWrapper<Experiment> queryWrapper = QueryGenerator.initQueryWrapper(experiment, req.getParameterMap(), customeRuleMap);
|
QueryWrapper<Experiment> queryWrapper = QueryGenerator.initQueryWrapper(experiment, req.getParameterMap(), customeRuleMap);
|
||||||
Page<Experiment> page = new Page<>(pageNo, pageSize);
|
Page<Experiment> page = new Page<>(pageNo, pageSize);
|
||||||
IPage<Experiment> pageList = experimentService.page(page, queryWrapper);
|
IPage<Experiment> pageList = experimentService.page(page, queryWrapper);
|
||||||
|
|||||||
Reference in New Issue
Block a user