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 ca39251b..f99ecd77 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 @@ -15,6 +15,8 @@ import com.jero.common.util.oConvertUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.collections4.CollectionUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.springframework.util.NumberUtils; import java.beans.PropertyDescriptor; @@ -157,32 +159,7 @@ public class QueryGenerator { doIntervalQuery(queryWrapper, parameterMap, type, name, column); //判断单值 参数带不同标识字符串 走不同的查询 //TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效 - if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) { - String multiLikeval = value.toString().replace(",,", COMMA); - String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA); - final String field = oConvertUtils.camelToUnderline(column); - if(vals.length>1) { - queryWrapper.and(j -> { - j = j.like(field,vals[0]); - for (int k=1;k j.like(field,vals[0])); - } - }else { - //根据参数值带什么关键字符串判断走什么类型的查询 - QueryRuleEnum rule = convert2Rule(value); - value = replaceValue(rule,value); - // add -begin 添加判断为字符串时设为全模糊查询 - //if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) { - // 可以设置左右模糊或全模糊,因人而异 - //rule = QueryRuleEnum.LIKE; - //} - // add -end 添加判断为字符串时设为全模糊查询 - addEasyQuery(queryWrapper, column, rule, value); - } + addQueryWapper(queryWrapper, column, value); } catch (Exception e) { log.error(e.getMessage(), e); @@ -197,6 +174,35 @@ public class QueryGenerator { } + private static void addQueryWapper(QueryWrapper queryWrapper, String column, Object value) { + if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) { + String multiLikeval = value.toString().replace(",,", COMMA); + String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA); + final String field = oConvertUtils.camelToUnderline(column); + if(vals.length>1) { + queryWrapper.and(j -> { + j = j.like(field,vals[0]); + for (int k=1;k j.like(field,vals[0])); + } + }else { + //根据参数值带什么关键字符串判断走什么类型的查询 + QueryRuleEnum rule = convert2Rule(value); + value = replaceValue(rule,value); + // add -begin 添加判断为字符串时设为全模糊查询 + //if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) { + // 可以设置左右模糊或全模糊,因人而异 + //rule = QueryRuleEnum.LIKE; + //} + // add -end 添加判断为字符串时设为全模糊查询 + addEasyQuery(queryWrapper, column, rule, value); + } + } + /** * 区间查询 @@ -281,31 +287,8 @@ public class QueryGenerator { } log.info("---高级查询参数-->" + conditions.toString()); queryWrapper.and(andWrapper -> { - for (int i = 0; i < conditions.size(); i++) { - QueryCondition rule = conditions.get(i); - if (oConvertUtils.isNotEmpty(rule.getField()) - && oConvertUtils.isNotEmpty(rule.getRule()) - && oConvertUtils.isNotEmpty(rule.getVal())) { - - log.debug("SuperQuery ==> " + rule.toString()); - - //update-begin-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 - Object queryValue = rule.getVal(); - if("date".equals(rule.getType())){ - queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get()); - }else if("datetime".equals(rule.getType())){ - queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get()); - } - addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue); - //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 - - // 如果拼接方式是OR,就拼接OR - if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) { - andWrapper.or(); - } - } - } - }); + andQueryWapper(fieldColumnMap, matchType, conditions, andWrapper); + }); } catch (UnsupportedEncodingException e) { log.error("--高级查询参数转码失败:" + superQueryParams, e); } catch (Exception e) { @@ -315,6 +298,34 @@ public class QueryGenerator { // update-end--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 ------- } } + + private static void andQueryWapper(Map fieldColumnMap, MatchTypeEnum matchType, List conditions, QueryWrapper andWrapper) { + for (int i = 0; i < conditions.size(); i++) { + QueryCondition rule = conditions.get(i); + if (oConvertUtils.isNotEmpty(rule.getField()) + && oConvertUtils.isNotEmpty(rule.getRule()) + && oConvertUtils.isNotEmpty(rule.getVal())) { + + log.debug("SuperQuery ==> " + rule.toString()); + + //update-begin-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 + Object queryValue = rule.getVal(); + if("date".equals(rule.getType())){ + queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get()); + }else if("datetime".equals(rule.getType())){ + queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get()); + } + addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue); + //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 + + // 如果拼接方式是OR,就拼接OR + if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) { + andWrapper.or(); + } + } + } + } + /** * 根据所传的值 转化成对应的比较方式 * 支持><= like in ! @@ -345,15 +356,7 @@ public class QueryGenerator { //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284--------------------- // step 3 like - if (rule == null && val.contains(STAR)) { - if (val.startsWith(STAR) && val.endsWith(STAR)) { - rule = QueryRuleEnum.LIKE; - } else if (val.startsWith(STAR)) { - rule = QueryRuleEnum.LEFT_LIKE; - } else if(val.endsWith(STAR)){ - rule = QueryRuleEnum.RIGHT_LIKE; - } - } + rule = getQueryRuleEnum(val, rule); // step 4 in if (rule == null && val.contains(COMMA)) { @@ -379,6 +382,20 @@ public class QueryGenerator { return rule != null ? rule : QueryRuleEnum.EQ; } + @Nullable + private static QueryRuleEnum getQueryRuleEnum(String val, QueryRuleEnum rule) { + if (rule == null && val.contains(STAR)) { + if (val.startsWith(STAR) && val.endsWith(STAR)) { + rule = QueryRuleEnum.LIKE; + } else if (val.startsWith(STAR)) { + rule = QueryRuleEnum.LEFT_LIKE; + } else if(val.endsWith(STAR)){ + rule = QueryRuleEnum.RIGHT_LIKE; + } + } + return rule; + } + /** * 替换掉关键字字符 * @@ -864,26 +881,36 @@ public class QueryGenerator { return "'"+str.substring(0,str.length()-1)+"%'"; } }else { - if(str.indexOf("%")>=0) { - if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ - if(str.startsWith("'") && str.endsWith("'")){ - return "N"+str; - }else{ - return "N"+"'"+str+"'"; - } - }else{ - if(str.startsWith("'") && str.endsWith("'")){ - return str; - }else{ - return "'"+str+"'"; - } - } - }else { - if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ - return "N'%"+str+"%'"; - }else{ - return "'%"+str+"%'"; - } + return getReturn(str); + } + } + + @NotNull + private static String getReturn(String str) { + if(str.contains("%")) { + return getSubReturn(str); + }else { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + return "N'%"+str+"%'"; + }else{ + return "'%"+str+"%'"; + } + } + } + + @NotNull + private static String getSubReturn(String str) { + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ + if(str.startsWith("'") && str.endsWith("'")){ + return "N"+str; + }else{ + return "N"+"'"+str+"'"; + } + }else{ + if(str.startsWith("'") && str.endsWith("'")){ + return str; + }else{ + return "'"+str+"'"; } } } @@ -900,13 +927,7 @@ public class QueryGenerator { Map ruleMap = getRuleMap(); PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(clazz); String sqlAnd = " and "; - for (Map.Entry entry : ruleMap.entrySet()) { - String c = entry.getKey(); - SysPermissionDataRuleModel sysPermissionDataRuleModel = entry.getValue(); - if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ - sb.append(sqlAnd).append(getSqlRuleValue(sysPermissionDataRuleModel.getRuleValue())); - } - } + appendStr(sb, ruleMap, sqlAnd); String name; String column; for (int i = 0; i < origDescriptors.length; i++) { @@ -937,6 +958,16 @@ public class QueryGenerator { return sb.toString(); } + private static void appendStr(StringBuilder sb, Map ruleMap, String sqlAnd) { + for (Map.Entry entry : ruleMap.entrySet()) { + String c = entry.getKey(); + SysPermissionDataRuleModel sysPermissionDataRuleModel = entry.getValue(); + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + sb.append(sqlAnd).append(getSqlRuleValue(sysPermissionDataRuleModel.getRuleValue())); + } + } + } + /** * 根据权限相关配置 组装mp需要的权限 * @param queryWrapper