虚拟清单-高级搜索%问题

This commit is contained in:
zhn
2022-06-06 17:33:16 +08:00
parent e6a4eabf97
commit 07958968fe
@@ -61,7 +61,7 @@ public class QueryGenerator {
/**mysql 模糊查询之特殊字符下划线 (_、\)*/ /**mysql 模糊查询之特殊字符下划线 (_、\)*/
public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%"; public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%";
/**时间格式化 */ /**时间格式化 */
private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>(); private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>();
private static SimpleDateFormat getTime(){ private static SimpleDateFormat getTime(){
@@ -72,7 +72,7 @@ public class QueryGenerator {
} }
return time; return time;
} }
/** /**
* 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成
* @param searchObj 查询实体 * @param searchObj 查询实体
@@ -89,32 +89,32 @@ public class QueryGenerator {
/** /**
* 组装Mybatis Plus 查询条件 * 组装Mybatis Plus 查询条件
* <p>使用此方法 需要有如下几点注意: * <p>使用此方法 需要有如下几点注意:
* <br>1.使用QueryWrapper 而非LambdaQueryWrapper; * <br>1.使用QueryWrapper 而非LambdaQueryWrapper;
* <br>2.实例化QueryWrapper时不可将实体传入参数 * <br>2.实例化QueryWrapper时不可将实体传入参数
* <br>错误示例:如QueryWrapper<jeroDemo> queryWrapper = new QueryWrapper<jeroDemo>(jeroDemo); * <br>错误示例:如QueryWrapper<jeroDemo> queryWrapper = new QueryWrapper<jeroDemo>(jeroDemo);
* <br>正确示例:QueryWrapper<jeroDemo> queryWrapper = new QueryWrapper<jeroDemo>(); * <br>正确示例:QueryWrapper<jeroDemo> queryWrapper = new QueryWrapper<jeroDemo>();
* <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
*/ */
public static void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap) { public static void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap) {
/* /*
* 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
但是不支持在自定义SQL中写orgCode in #{sys_org_code} 但是不支持在自定义SQL中写orgCode in #{sys_org_code}
当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}' 当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}'
*/ */
//区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询
PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj); PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj);
Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap(); Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
//权限规则自定义SQL表达式 //权限规则自定义SQL表达式
for (String c : ruleMap.keySet()) { for (String c : ruleMap.keySet()) {
if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));
} }
} }
String name, type, column; String name, type, column;
// update-begin--Author:taoyan Date:20200923 forissues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- // update-begin--Author:taoyan Date:20200923 forissues/1671 如果字段加注解了@TableField(exist = false),不走DB查询-------
//定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题 //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题
@@ -170,18 +170,18 @@ public class QueryGenerator {
// add -end 添加判断为字符串时设为全模糊查询 // add -end 添加判断为字符串时设为全模糊查询
addEasyQuery(queryWrapper, column, rule, value); addEasyQuery(queryWrapper, column, rule, value);
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
// 排序逻辑 处理 // 排序逻辑 处理
doMultiFieldsOrder(queryWrapper, parameterMap); doMultiFieldsOrder(queryWrapper, parameterMap);
//高级查询 //高级查询
doSuperQuery(queryWrapper, parameterMap, fieldColumnMap); doSuperQuery(queryWrapper, parameterMap, fieldColumnMap);
// update-end--Author:taoyan Date:20200923 forissues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- // update-end--Author:taoyan Date:20200923 forissues/1671 如果字段加注解了@TableField(exist = false),不走DB查询-------
} }
@@ -211,7 +211,7 @@ public class QueryGenerator {
addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN); addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN);
} }
} }
//多字段排序 TODO 需要修改前端 //多字段排序 TODO 需要修改前端
public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) { public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) {
String column=null,order=null; String column=null,order=null;
@@ -228,8 +228,8 @@ public class QueryGenerator {
column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
} }
//SQL注入check //SQL注入check
SqlInjectionUtil.filterContent(column); SqlInjectionUtil.filterContent(column);
if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) { if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {
queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
} else { } else {
@@ -237,7 +237,7 @@ public class QueryGenerator {
} }
} }
} }
/** /**
* 高级查询 * 高级查询
* @param queryWrapper 查询对象 * @param queryWrapper 查询对象
@@ -272,6 +272,8 @@ public class QueryGenerator {
queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get()); queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get());
}else if("datetime".equals(rule.getType())){ }else if("datetime".equals(rule.getType())){
queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get()); queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get());
}else if("string".equals(rule.getType())){
queryValue = queryValue.toString().replaceAll("%","/%");
} }
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 日期等于查询报错
@@ -343,7 +345,7 @@ public class QueryGenerator {
//TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来 //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来
rule = QueryRuleEnum.IN; rule = QueryRuleEnum.IN;
} }
// step 5 != // step 5 !=
if(rule == null && val.startsWith(NOT_EQUAL)){ if(rule == null && val.startsWith(NOT_EQUAL)){
rule = QueryRuleEnum.NE; rule = QueryRuleEnum.NE;
} }
@@ -361,10 +363,10 @@ public class QueryGenerator {
return rule != null ? rule : QueryRuleEnum.EQ; return rule != null ? rule : QueryRuleEnum.EQ;
} }
/** /**
* 替换掉关键字字符 * 替换掉关键字字符
* *
* @param rule * @param rule
* @param value * @param value
* @return * @return
@@ -405,7 +407,7 @@ 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)) {
Object temp; Object temp;
@@ -445,7 +447,7 @@ public class QueryGenerator {
addEasyQuery(queryWrapper, name, rule, temp); addEasyQuery(queryWrapper, name, rule, temp);
} }
} }
/** /**
* 获取日期类型的值 * 获取日期类型的值
* @param value * @param value
@@ -470,7 +472,7 @@ public class QueryGenerator {
} }
return date; return date;
} }
/** /**
* 根据规则走不同的查询 * 根据规则走不同的查询
* @param queryWrapper QueryWrapper * @param queryWrapper QueryWrapper
@@ -533,7 +535,7 @@ public class QueryGenerator {
} }
} }
/** /**
* *
* @param name * @param name
* @return * @return
*/ */
@@ -543,7 +545,7 @@ public class QueryGenerator {
|| "sort".equals(name) || "order".equals(name); || "sort".equals(name) || "order".equals(name);
} }
/** /**
* 获取请求对应的数据权限规则 * 获取请求对应的数据权限规则
@@ -590,7 +592,7 @@ 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)) {
@@ -615,7 +617,7 @@ public class QueryGenerator {
} }
} }
} }
public static String converRuleValue(String ruleValue) { public static String converRuleValue(String ruleValue) {
String value = JwtUtil.getUserSystemData(ruleValue,null); String value = JwtUtil.getUserSystemData(ruleValue,null);
return value!= null ? value : ruleValue; return value!= null ? value : ruleValue;
@@ -625,7 +627,7 @@ public class QueryGenerator {
* @author: scott * @author: scott
* @Description: 去掉值前后单引号 * @Description: 去掉值前后单引号
* @date: 2020/3/19 21:26 * @date: 2020/3/19 21:26
* @param ruleValue: * @param ruleValue:
* @Return: java.lang.String * @Return: java.lang.String
*/ */
public static String trimSingleQuote(String ruleValue) { public static String trimSingleQuote(String ruleValue) {
@@ -640,7 +642,7 @@ public class QueryGenerator {
} }
return ruleValue; return ruleValue;
} }
public static String getSqlRuleValue(String sqlRule){ public static String getSqlRuleValue(String sqlRule){
try { try {
Set<String> varParams = getSqlRuleParams(sqlRule); Set<String> varParams = getSqlRuleParams(sqlRule);
@@ -653,7 +655,7 @@ public class QueryGenerator {
} }
return sqlRule; return sqlRule;
} }
/** /**
* 获取sql中的#{key} 这个key组成的set * 获取sql中的#{key} 这个key组成的set
*/ */
@@ -663,7 +665,7 @@ public class QueryGenerator {
} }
Set<String> varParams = new HashSet<String>(); Set<String> varParams = new HashSet<String>();
String regex = "\\#\\{\\w+\\}"; String regex = "\\#\\{\\w+\\}";
Pattern p = Pattern.compile(regex); Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(sql); Matcher m = p.matcher(sql);
while(m.find()){ while(m.find()){
@@ -672,9 +674,9 @@ public class QueryGenerator {
} }
return varParams; return varParams;
} }
/** /**
* 获取查询条件 * 获取查询条件
* @param field * @param field
* @param alias * @param alias
* @param value * @param value
@@ -824,7 +826,7 @@ public class QueryGenerator {
return "("+value.toString()+")"; return "("+value.toString()+")";
} }
} }
private static String getLikeConditionValue(Object value) { private static String getLikeConditionValue(Object value) {
String str = value.toString().trim(); String str = value.toString().trim();
if(str.startsWith("*") && str.endsWith("*")) { if(str.startsWith("*") && str.endsWith("*")) {
@@ -869,7 +871,7 @@ public class QueryGenerator {
} }
} }
} }
/** /**
* 根据权限相关配置生成相关的SQL 语句 * 根据权限相关配置生成相关的SQL 语句
* @param clazz * @param clazz
@@ -915,7 +917,7 @@ public class QueryGenerator {
log.info("query auth sql is:"+sb.toString()); log.info("query auth sql is:"+sb.toString());
return sb.toString(); return sb.toString();
} }
/** /**
* 根据权限相关配置 组装mp需要的权限 * 根据权限相关配置 组装mp需要的权限
* @param queryWrapper * @param queryWrapper