From 07958968fe5b4db6f4028a09c806e113eb9ea66d Mon Sep 17 00:00:00 2001 From: zhn <947514737@qq.com> Date: Mon, 6 Jun 2022 17:33:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E6=B8=85=E5=8D=95-=E9=AB=98?= =?UTF-8?q?=E7=BA=A7=E6=90=9C=E7=B4=A2%=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/system/query/QueryGenerator.java | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) 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 b7db1ece8..5a711c8d3 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 @@ -61,7 +61,7 @@ public class QueryGenerator { /**mysql 模糊查询之特殊字符下划线 (_、\)*/ public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%"; - + /**时间格式化 */ private static final ThreadLocal local = new ThreadLocal(); private static SimpleDateFormat getTime(){ @@ -72,7 +72,7 @@ public class QueryGenerator { } return time; } - + /** * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 * @param searchObj 查询实体 @@ -89,32 +89,32 @@ 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注解 那么查询条件会出问题 @@ -170,18 +170,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查询------- - + } @@ -211,7 +211,7 @@ public class QueryGenerator { addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN); } } - + //多字段排序 TODO 需要修改前端 public static void doMultiFieldsOrder(QueryWrapper queryWrapper,Map parameterMap) { String column=null,order=null; @@ -228,8 +228,8 @@ public class QueryGenerator { column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); } //SQL注入check - SqlInjectionUtil.filterContent(column); - + SqlInjectionUtil.filterContent(column); + if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) { queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); } else { @@ -237,7 +237,7 @@ public class QueryGenerator { } } } - + /** * 高级查询 * @param queryWrapper 查询对象 @@ -272,6 +272,8 @@ public class QueryGenerator { queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get()); }else if("datetime".equals(rule.getType())){ 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); //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 @@ -343,7 +345,7 @@ public class QueryGenerator { //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来 rule = QueryRuleEnum.IN; } - // step 5 != + // step 5 != if(rule == null && val.startsWith(NOT_EQUAL)){ rule = QueryRuleEnum.NE; } @@ -361,10 +363,10 @@ public class QueryGenerator { return rule != null ? rule : QueryRuleEnum.EQ; } - + /** * 替换掉关键字字符 - * + * * @param rule * @param value * @return @@ -405,7 +407,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; @@ -445,7 +447,7 @@ public class QueryGenerator { addEasyQuery(queryWrapper, name, rule, temp); } } - + /** * 获取日期类型的值 * @param value @@ -470,7 +472,7 @@ public class QueryGenerator { } return date; } - + /** * 根据规则走不同的查询 * @param queryWrapper QueryWrapper @@ -533,7 +535,7 @@ public class QueryGenerator { } } /** - * + * * @param name * @return */ @@ -543,7 +545,7 @@ public class QueryGenerator { || "sort".equals(name) || "order".equals(name); } - + /** * 获取请求对应的数据权限规则 @@ -590,7 +592,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)) { @@ -615,7 +617,7 @@ public class QueryGenerator { } } } - + public static String converRuleValue(String ruleValue) { String value = JwtUtil.getUserSystemData(ruleValue,null); return value!= null ? value : ruleValue; @@ -625,7 +627,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) { @@ -640,7 +642,7 @@ public class QueryGenerator { } return ruleValue; } - + public static String getSqlRuleValue(String sqlRule){ try { Set varParams = getSqlRuleParams(sqlRule); @@ -653,7 +655,7 @@ public class QueryGenerator { } return sqlRule; } - + /** * 获取sql中的#{key} 这个key组成的set */ @@ -663,7 +665,7 @@ public class QueryGenerator { } Set varParams = new HashSet(); String regex = "\\#\\{\\w+\\}"; - + Pattern p = Pattern.compile(regex); Matcher m = p.matcher(sql); while(m.find()){ @@ -672,9 +674,9 @@ public class QueryGenerator { } return varParams; } - + /** - * 获取查询条件 + * 获取查询条件 * @param field * @param alias * @param value @@ -824,7 +826,7 @@ public class QueryGenerator { return "("+value.toString()+")"; } } - + private static String getLikeConditionValue(Object value) { String str = value.toString().trim(); if(str.startsWith("*") && str.endsWith("*")) { @@ -869,7 +871,7 @@ public class QueryGenerator { } } } - + /** * 根据权限相关配置生成相关的SQL 语句 * @param clazz @@ -915,7 +917,7 @@ public class QueryGenerator { log.info("query auth sql is:"+sb.toString()); return sb.toString(); } - + /** * 根据权限相关配置 组装mp需要的权限 * @param queryWrapper