diff --git a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java index 4c01d834..e53fca03 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java +++ b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/query/QueryGenerator.java @@ -12,6 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import lombok.val; import org.apache.commons.beanutils.PropertyUtils; import com.jero.common.constant.CommonConstant; import com.jero.common.constant.DataBaseConstant; @@ -22,6 +23,8 @@ import com.jero.common.util.CommonUtils; import com.jero.common.util.DateUtils; import com.jero.common.util.SqlInjectionUtil; import com.jero.common.util.oConvertUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.ss.formula.functions.T; import org.springframework.util.NumberUtils; import com.alibaba.fastjson.JSON; @@ -33,6 +36,11 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class QueryGenerator { + + private QueryGenerator(){ + + } + public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN"; private static final String BEGIN = "_begin"; @@ -64,9 +72,9 @@ public class QueryGenerator { /**mysql 模糊查询之特殊字符下划线 (_、\)*/ public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%"; - + /**时间格式化 */ - private static final ThreadLocal local = new ThreadLocal(); + private static final ThreadLocal local = new ThreadLocal<>(); private static SimpleDateFormat getTime(){ SimpleDateFormat time = local.get(); if(time == null){ @@ -75,7 +83,11 @@ public class QueryGenerator { } return time; } - + + public void unload() { + local.remove(); + } + /** * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 * @param searchObj 查询实体 @@ -84,7 +96,7 @@ public class QueryGenerator { */ public static QueryWrapper initQueryWrapper(T searchObj,Map parameterMap){ long start = System.currentTimeMillis(); - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); installMplus(queryWrapper, searchObj, parameterMap); log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); return queryWrapper; @@ -92,36 +104,36 @@ public class QueryGenerator { /** * 组装Mybatis Plus 查询条件 - *

使用此方法 需要有如下几点注意: + *

使用此方法 需要有如下几点注意: *
1.使用QueryWrapper 而非LambdaQueryWrapper; - *
2.实例化QueryWrapper时不可将实体传入参数 + *
2.实例化QueryWrapper时不可将实体传入参数 *
错误示例:如QueryWrapper queryWrapper = new QueryWrapper(jeroDemo); *
正确示例:QueryWrapper queryWrapper = new QueryWrapper(); *
3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 */ public static void installMplus(QueryWrapper queryWrapper,Object searchObj,Map parameterMap) { - + /* * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 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}' */ - + //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj); Map ruleMap = getRuleMap(); - + //权限规则自定义SQL表达式 for (String c : ruleMap.keySet()) { if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); } } - + String name, type, column; // update-begin--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题 - Map fieldColumnMap = new HashMap(); + Map fieldColumnMap = new HashMap<>(); for (int i = 0; i < origDescriptors.length; i++) { //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况 name = origDescriptors[i].getName(); @@ -156,7 +168,6 @@ public class QueryGenerator { for (int k=1;k j.like(field,vals[0])); @@ -173,18 +184,18 @@ public class QueryGenerator { // add -end 添加判断为字符串时设为全模糊查询 addEasyQuery(queryWrapper, column, rule, value); } - + } catch (Exception e) { log.error(e.getMessage(), e); } } - // 排序逻辑 处理 + // 排序逻辑 处理 doMultiFieldsOrder(queryWrapper, parameterMap); - + //高级查询 doSuperQuery(queryWrapper, parameterMap, fieldColumnMap); // update-end--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- - + } @@ -214,7 +225,7 @@ public class QueryGenerator { addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN); } } - + //多字段排序 public static void doMultiFieldsOrder(QueryWrapper queryWrapper,Map parameterMap) { String column=null,order=null; @@ -226,7 +237,7 @@ public class QueryGenerator { } if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { //字典字段,去掉字典翻译文本后缀 - if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) { + if(column != null && column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) { column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); } //SQL注入check @@ -236,7 +247,7 @@ public class QueryGenerator { // 排序规则修改 // 将现有排序 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1,column2 desc" // 修改为 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1 desc,column2 desc" - if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) { + if (order != null && order.toUpperCase().contains(ORDER_TYPE_ASC)) { String columnStr = oConvertUtils.camelToUnderline(column); String[] columnArray = columnStr.split(","); queryWrapper.orderByAsc(Arrays.asList(columnArray)); @@ -248,7 +259,7 @@ public class QueryGenerator { //update-end--Author:scott Date:20210531 for:36 多条件排序无效问题修正------- } } - + /** * 高级查询 * @param queryWrapper 查询对象 @@ -264,7 +275,7 @@ public class QueryGenerator { try { superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8"); List conditions = JSON.parseArray(superQueryParams, QueryCondition.class); - if (conditions == null || conditions.size() == 0) { + if (conditions == null || conditions.isEmpty()) { return; } log.info("---高级查询参数-->" + conditions.toString()); @@ -293,7 +304,6 @@ public class QueryGenerator { } } } - //return andWrapper; }); } catch (UnsupportedEncodingException e) { log.error("--高级查询参数转码失败:" + superQueryParams, e); @@ -303,7 +313,6 @@ public class QueryGenerator { } // update-end--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 ------- } - //log.info(" superQuery getCustomSqlSegment: "+ queryWrapper.getCustomSqlSegment()); } /** * 根据所传的值 转化成对应的比较方式 @@ -354,12 +363,12 @@ public class QueryGenerator { //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来 rule = QueryRuleEnum.IN; } - // step 5 != + // step 5 != if(rule == null && val.startsWith(NOT_EQUAL)){ rule = QueryRuleEnum.NE; } // step 6 xx+xx+xx 这种情况适用于如果想要用逗号作精确查询 但是系统默认逗号走in 所以可以用++替换【此逻辑作废】 - if(rule == null && val.indexOf(QUERY_COMMA_ESCAPE)>0){ + if(rule == null && val.contains(QUERY_COMMA_ESCAPE)){ rule = QueryRuleEnum.EQ_WITH_ADD; } @@ -372,10 +381,10 @@ public class QueryGenerator { return rule != null ? rule : QueryRuleEnum.EQ; } - + /** * 替换掉关键字字符 - * + * * @param rule * @param value * @return @@ -403,7 +412,7 @@ public class QueryGenerator { } else if (rule == QueryRuleEnum.IN) { value = val.split(","); } else if (rule == QueryRuleEnum.EQ_WITH_ADD) { - value = val.replaceAll("\\+\\+", COMMA); + value = val.replace("\\+\\+", COMMA); }else { //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284------------------- if(val.startsWith(rule.getValue())){ @@ -416,7 +425,7 @@ public class QueryGenerator { } return value; } - + private static void addQueryByRule(QueryWrapper queryWrapper,String name,String type,String value,QueryRuleEnum rule) throws ParseException { if(oConvertUtils.isNotEmpty(value)) { Object temp; @@ -456,7 +465,7 @@ public class QueryGenerator { addEasyQuery(queryWrapper, name, rule, temp); } } - + /** * 获取日期类型的值 * @param value @@ -481,7 +490,7 @@ public class QueryGenerator { } return date; } - + /** * 根据规则走不同的查询 * @param queryWrapper QueryWrapper @@ -544,26 +553,26 @@ public class QueryGenerator { } } /** - * + * * @param name * @return */ private static boolean judgedIsUselessField(String name) { return "class".equals(name) || "ids".equals(name) || "page".equals(name) || "rows".equals(name) - || "sort".equals(name) || "order".equals(name); + || "sort".equals(name) || ORDER_TYPE.equals(name); } - + /** * 获取请求对应的数据权限规则 * @return */ public static Map getRuleMap() { - Map ruleMap = new HashMap(); + Map ruleMap = new HashMap<>(); List list = JeroDataAutorUtils.loadDataSearchConditon(); - if(list != null&&list.size()>0){ + if(list != null&&!list.isEmpty()){ if(list.get(0)==null){ return ruleMap; } @@ -583,11 +592,11 @@ public class QueryGenerator { * @return */ public static Map getRuleMap(List list) { - Map ruleMap = new HashMap(); + Map ruleMap = new HashMap<>(); if(list==null){ list = JeroDataAutorUtils.loadDataSearchConditon(); } - if(list != null&&list.size()>0){ + if(list != null&&!list.isEmpty()){ if(list.get(0)==null){ return ruleMap; } @@ -601,7 +610,7 @@ public class QueryGenerator { } return ruleMap; } - + private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper queryWrapper) { QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); if(rule.equals(QueryRuleEnum.IN) && ! propertyType.equals(String.class)) { @@ -626,7 +635,7 @@ public class QueryGenerator { } } } - + public static String converRuleValue(String ruleValue) { String value = JwtUtil.getUserSystemData(ruleValue,null); return value!= null ? value : ruleValue; @@ -636,7 +645,7 @@ public class QueryGenerator { * @author: scott * @Description: 去掉值前后单引号 * @date: 2020/3/19 21:26 - * @param ruleValue: + * @param ruleValue: * @Return: java.lang.String */ public static String trimSingleQuote(String ruleValue) { @@ -651,7 +660,7 @@ public class QueryGenerator { } return ruleValue; } - + public static String getSqlRuleValue(String sqlRule){ try { Set varParams = getSqlRuleParams(sqlRule); @@ -664,7 +673,7 @@ public class QueryGenerator { } return sqlRule; } - + /** * 获取sql中的#{key} 这个key组成的set */ @@ -672,9 +681,9 @@ public class QueryGenerator { if(oConvertUtils.isEmpty(sql)){ return null; } - Set varParams = new HashSet(); + Set varParams = new HashSet<>(); String regex = "\\#\\{\\w+\\}"; - + Pattern p = Pattern.compile(regex); Matcher m = p.matcher(sql); while(m.find()){ @@ -683,9 +692,9 @@ public class QueryGenerator { } return varParams; } - + /** - * 获取查询条件 + * 获取查询条件 * @param field * @param alias * @param value @@ -725,6 +734,7 @@ public class QueryGenerator { */ public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString, String dataBaseType) { String res = ""; + String like = " like "; switch (rule) { case GT: res =field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType); @@ -751,13 +761,13 @@ public class QueryGenerator { res = field + " in "+getInConditionValue(value, isString); break; case LIKE: - res = field + " like "+getLikeConditionValue(value); + res = field + like+getLikeConditionValue(value); break; case LEFT_LIKE: - res = field + " like "+getLikeConditionValue(value); + res = field + like+getLikeConditionValue(value); break; case RIGHT_LIKE: - res = field + " like "+getLikeConditionValue(value); + res = field + like+getLikeConditionValue(value); break; default: res = field+" = "+getFieldConditionValue(value, isString, dataBaseType); @@ -798,8 +808,8 @@ public class QueryGenerator { str = str.substring(1); }else if(str.startsWith("<")) { str = str.substring(1); - }else if(str.indexOf(QUERY_COMMA_ESCAPE)>0) { - str = str.replaceAll("\\+\\+", COMMA); + }else if(str.contains(QUERY_COMMA_ESCAPE)) { + str = str.replace("\\+\\+", COMMA); } if(dataBaseType==null){ dataBaseType = getDbType(); @@ -822,12 +832,12 @@ public class QueryGenerator { private static String getInConditionValue(Object value,boolean isString) { if(isString) { String temp[] = value.toString().split(","); - String res=""; + StringBuilder res= new StringBuilder(); for (String string : temp) { if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ - res+=",N'"+string+"'"; + res.append(",N'").append(string).append("'"); }else{ - res+=",'"+string+"'"; + res.append(",'").append(string).append("'"); } } return "("+res.substring(1)+")"; @@ -835,7 +845,7 @@ public class QueryGenerator { return "("+value.toString()+")"; } } - + private static String getLikeConditionValue(Object value) { String str = value.toString().trim(); if(str.startsWith("*") && str.endsWith("*")) { @@ -880,7 +890,7 @@ public class QueryGenerator { } } } - + /** * 根据权限相关配置生成相关的SQL 语句 * @param clazz @@ -888,7 +898,7 @@ public class QueryGenerator { */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static String installAuthJdbc(Class clazz) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); //权限查询 Map ruleMap = getRuleMap(); PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz); @@ -926,7 +936,7 @@ public class QueryGenerator { log.info("query auth sql is:"+sb.toString()); return sb.toString(); } - + /** * 根据权限相关配置 组装mp需要的权限 * @param queryWrapper @@ -1019,7 +1029,7 @@ public class QueryGenerator { * @return */ private static List getClassFields(Class clazz) { - List list = new ArrayList(); + List list = new ArrayList<>(); Field[] fields; do{ fields = clazz.getDeclaredFields(); @@ -1051,7 +1061,7 @@ public class QueryGenerator { if (field == null) { List allFields = getClassFields(clazz); List searchFields = allFields.stream().filter(a -> a.getName().equals(name)).collect(Collectors.toList()); - if(searchFields!=null && searchFields.size()>0){ + if(!CollectionUtils.isEmpty(searchFields)){ field = searchFields.get(0); } }