Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue
@@ -144,6 +144,9 @@ }, { value: "_notlike", label: "不包含", },{ value: "_in", label: "范围(,间隔)", } ], // 字段类型是单选或下拉框类型的条件数组 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
@@ -14,7 +14,7 @@ import java.util.Map; /** * in 参数截取,返回wrapper * in 参数截取,返回wrapper/或者where条件字符串 * * @author ludc * @date 2023/5/5 @@ -22,6 +22,76 @@ public class MybatisParameterUtil { /** * Oracle IN 查询的最大参数限制 */ private static final int MAX_IN_CLAUSE_SIZE = 1000; /** * 将给定的 ID 列表转换为适合 Oracle 的查询条件 * * @param ids ID 列表 * @return 适合 Oracle 的查询条件 */ public static String convertToOrConditions(String filed,List<String> ids) { if (ids == null || ids.isEmpty()) { return ""; } StringBuilder queryBuilder = new StringBuilder(); int size = ids.size(); // 分批处理,避免超过 Oracle IN 查询的最大限制 for (int i = 0; i < size; i += MAX_IN_CLAUSE_SIZE) { int end = Math.min(i + MAX_IN_CLAUSE_SIZE, size); List<String> subList = ids.subList(i, end); if (queryBuilder.length() > 0) { queryBuilder.append(" OR "); } queryBuilder.append("(") .append(getInClause(filed,subList)).append(")"); } return queryBuilder.toString(); } /* * 获取 IN 查询条件字符串 * @param ids ID 列表 * @return IN 查询条件字符串 */ private static String getInClause(String filed,List<String> ids) { StringBuilder inClauseBuilder = new StringBuilder(); inClauseBuilder.append(filed + " IN ("); for (int i = 0; i < ids.size(); i++) { inClauseBuilder.append("'").append(ids.get(i)).append("'"); if (i < ids.size() - 1) { inClauseBuilder.append(", "); } } inClauseBuilder.append(")"); return inClauseBuilder.toString(); } /** * 获取 IN 查询条件字符串(不包含in) * * @param ids ID 列表 * @return IN 查询条件字符串 */ public static String getInClause(List<String> ids) { StringBuilder inClauseBuilder = new StringBuilder(); for (int i = 0; i < ids.size(); i++) { inClauseBuilder.append("'").append(ids.get(i)).append("'"); if (i < ids.size() - 1) { inClauseBuilder.append(", "); } } return inClauseBuilder.toString(); } /** * in作为查询条件时,防止大于1000出现报错,对条件进行截取,连表查询的wrapper * @param wrapper MPJLambdaWrapper,不进行连表查询时使用 * @param column 作为in的条件列 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -2078,9 +2078,9 @@ wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false); // maps.stream().forEach(map -> { // Map<String, String> data = new HashMap<>(); //// map.forEach((key, value) -> { //// data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value)); //// }); // map.forEach((key, value) -> { // data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value)); // }); // for (String s : map.keySet()) { // data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s))); // } @@ -2569,8 +2569,19 @@ if (referFieldMap.containsKey(field)) { return VciBaseUtil.toInSql(referFieldMap.get(field), value); //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE; } else { return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE; //TODO:暂时没考虑IN>1000条的问题 //return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE; return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE; } } else if (key.endsWith("_notin")) { String field = UBCSSqlKeyword.getColumn(key, "_in"); if (referFieldMap.containsKey(field)) { return VciBaseUtil.toInSql(referFieldMap.get(field), value); //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE; } else { //return (field.contains(".") ? "" : "t.") + field + SPACE + "not in (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE; return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE; } } else { // if (referFieldMap.containsKey(key)) { // //说明是参照的,我们参照的查询都认为是字符串,如果是时间格式的查询肯定有问题, @@ -2667,15 +2678,23 @@ || VciFieldTypeEnum.VTInteger.equals(fieldTypeEnum)) { return value; } else { if(value.contains("IN//")){ return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//",""))); } return "'" + value + "'"; } } else { if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) { return value; } }else if(value.contains("IN//")){ //暂时不考虑>1000的情况,因为搜索一般也不会出现搜索1000条的情况 //return MybatisParameterUtil.convertToOrConditions(field, Func.toStrList(value.replace("IN//",""))); return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//",""))); }else{ return "'" + value + "'"; } } } }