From f4b5957a7b8dd169908e91aa7f09a33c3028ebec Mon Sep 17 00:00:00 2001 From: maolei Date: Mon, 12 May 2025 14:02:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(uapbd):=20=E6=96=B0=E5=A2=9E=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E7=9A=84=E6=9F=A5=E8=AF=A2&=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E7=9A=84=20SQL=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=9D=A1=E4=BB=B6=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 QuerySyncSqlUtils 工具类,用于构建通用 SQL 条件 - 在 QuerySync 类中实现查询逻辑,使用新工具类生成 SQL 条件 - 添加分页功能,处理大量数据查询 - 优化 SQL 查询性能,通过 IN 子句批量查询主键 --- .../public/nccloud/api/uapbd/QuerySync.java | 36 ++++- .../nccloud/api/uapbd/QuerySyncSqlUtils.java | 127 ++++++++++++++++++ 2 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 uapbd/src/public/nccloud/api/uapbd/QuerySyncSqlUtils.java diff --git a/uapbd/src/public/nccloud/api/uapbd/QuerySync.java b/uapbd/src/public/nccloud/api/uapbd/QuerySync.java index 43cff15..fcfdb71 100644 --- a/uapbd/src/public/nccloud/api/uapbd/QuerySync.java +++ b/uapbd/src/public/nccloud/api/uapbd/QuerySync.java @@ -1,12 +1,19 @@ package nccloud.api.uapbd; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.jdbc.framework.processor.ColumnListProcessor; +import nc.jdbc.framework.processor.MapListProcessor; import nccloud.api.rest.utils.IJsonForAPI; import nccloud.api.rest.utils.JsonFactoryForAPI; +import nccloud.api.rest.utils.OpenApiPageInfo; import nccloud.api.rest.utils.ResultMessageUtil; import nccloud.api.rest.utils.vo.ApiDataVO; import nccloud.api.rest.utils.vo.ApiQueryParam; import nccloud.api.rest.utils.vo.ApiUfinterface; +import nccloud.api.uapbd.common.utils.OpenApiPagenationUtils; import nccloud.ws.rest.resource.AbstractNCCRestResource; import org.json.JSONString; @@ -14,10 +21,15 @@ import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + @Path("/uapbd/querySync") public class QuerySync extends AbstractNCCRestResource { + public static final BaseDAO BASE_DAO = new BaseDAO(); @Override public String getModule() { return "uapbd"; @@ -51,9 +63,29 @@ public class QuerySync extends AbstractNCCRestResource { } } - private JSONString queryStordoc(ApiUfinterface apiUfinterface) { + private JSONString queryStordoc(ApiUfinterface apiUfinterface) throws DAOException { + Map data = apiUfinterface.getData().getParamdata(); + JSONObject pageInfo = (JSONObject) JSONObject.toJSON(apiUfinterface.getPageInfo()); + data.remove("type"); + String condition = QuerySyncSqlUtils.buildUniversalCondition(data); - return null; + String sql = "SELECT pk_stordoc FROM V_UAPBD_QUERYSYNC_STORDOC WHERE " + condition; + List allPks = (List) BASE_DAO.executeQuery(sql, new ColumnListProcessor()); + OpenApiPageInfo openApiPageInfo = new OpenApiPageInfo(); + String[] currPks = OpenApiPagenationUtils.getCurrentPagePksAndPageInfo(allPks, pageInfo, openApiPageInfo); + + if (currPks == null || currPks.length == 0) { + return ResultMessageUtil.toJSONByPage(new JSONObject[0], openApiPageInfo, false); + } + StringJoiner stringJoiner = new StringJoiner(","); + for (String pk : currPks) { + stringJoiner.add("'" + pk + "'"); + } + String pks = "(" + stringJoiner + ")"; + + List> rows = (List>) BASE_DAO.executeQuery("select * from v_uapbd_querysync_stordoc where pk_stordoc in " + pks, new MapListProcessor()); + + return ResultMessageUtil.toJSONByPage(rows, openApiPageInfo, false); } } \ No newline at end of file diff --git a/uapbd/src/public/nccloud/api/uapbd/QuerySyncSqlUtils.java b/uapbd/src/public/nccloud/api/uapbd/QuerySyncSqlUtils.java new file mode 100644 index 0000000..b914dad --- /dev/null +++ b/uapbd/src/public/nccloud/api/uapbd/QuerySyncSqlUtils.java @@ -0,0 +1,127 @@ +package nccloud.api.uapbd; + + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class QuerySyncSqlUtils { + + /** + * SQL INӾ䡣 + * 磺fieldName IN ('value1', 123, NULL) + * ˷ٶ `values` бǷǿյģɵ÷ `buildUniversalCondition` ֤ + * + * @param fieldName ֶ + * @param values ֵб (ԷǿList) + * @return õINӾַ + */ + private static String buildInClause(String fieldName, List values) { + String inValues = values.stream() + .map(val -> { + if (val == null) { + return "NULL"; // SQLеNULL + } + if (val instanceof String) { + return "'" + escapeSql((String) val) + "'"; + } + if (val instanceof Number || val instanceof Boolean) { + return val.toString(); // ֺͲֵҪ + } + // ͣڡԶȣĬϰtoString()תͼӵ + return "'" + escapeSql(val.toString()) + "'"; + }) + .collect(Collectors.joining(", ")); // עöźͿոָ + return fieldName + " IN (" + inValues + ")"; + } + + /** + * ͨùSQL + * ݲMap̬SQL WHEREӾ֡ + * - ڼֵnullǿַʹƥ (field = value) + * - ڷǿList͵ֵʹINƥ (field IN (value1, value2, ...)) + * - ֵΪnullַList飬򲻴ֶΡ + * - ɵᱻԲŰ + * - ûЧɣmapΪջֵЧ򷵻 "(1=1)" ȷSQL﷨ȷ + * + * @param paramMap MapΪֵֶΪֵֶ + * @return õSQLַ "(field1 = 'value1' AND field2 IN ('a', 'b'))" "(1=1)" + */ + public static String buildUniversalCondition(Map paramMap) { + if (paramMap == null || paramMap.isEmpty()) { + return "(1=1)"; // mapΪnullգֱӷ(1=1) + } + + List conditions = new ArrayList<>(); + + for (Map.Entry entry : paramMap.entrySet()) { + String fieldName = entry.getKey(); + Object value = entry.getValue(); + + // 1. ֵΪ null򲻴Ŀ + if (value == null) { + continue; + } + + // 2. ֵͽд + if (value instanceof String) { + String stringValue = (String) value; + if (stringValue.trim().isEmpty()) { // ǿַո + continue; // + } + conditions.add(fieldName + " = " + formatSqlValue(stringValue)); + } else if (value instanceof List) { + List listValue = (List) value; + if (listValue.isEmpty()) { // бΪ + continue; // + } + conditions.add(buildInClause(fieldName, listValue)); + } else if (value.getClass().isArray()) { + int length = Array.getLength(value); + if (length == 0) { // Ϊ + continue; // + } + List arrayAsList = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + arrayAsList.add(Array.get(value, i)); + } + conditions.add(buildInClause(fieldName, arrayAsList)); // ԪתΪList + } else { + // nullǿַǿռ/ֵͣ֡ڵȣ + // formatSqlValue ᴦǵĸʽ + conditions.add(fieldName + " = " + formatSqlValue(value)); + } + } + + if (conditions.isEmpty()) { + return "(1=1)"; // ûռκЧ(1=1) + } + + return "(" + String.join(" AND ", conditions) + ")"; // ANDӲŰ + } + + private static String escapeSql(String value) { + return value == null ? null : value.replace("'", "''"); + } + + /** + * ʽSQLѯеĵֵ + * ˷ٶ `value` nullңַǿ + * + * @param value Ҫʽֵ (Ϊnull) + * @return ʽSQLֵַ + */ + private static String formatSqlValue(Object value) { + // value ﱣ֤Ϊnull + if (value instanceof String) { + // ַļ buildUniversalCondition + return "'" + escapeSql((String) value) + "'"; + } else if (value instanceof Number || value instanceof Boolean) { + return value.toString(); // ֺͲֱֵʹַʾӵ + } + return "'" + escapeSql(value.toString()) + "'"; + } + +}