From 501876dd2523ff4ae0b7a6b67d144416465542a2 Mon Sep 17 00:00:00 2001 From: junjun Date: Tue, 24 Sep 2024 15:22:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=95=B0=E6=8D=AE=E6=BA=90):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96SQL=20Server=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/constant/SQLConstants.java | 2 ++ .../engine/trans/CustomWhere2Str.java | 25 ++++++++++++++++--- .../dataease/engine/trans/ExtWhere2Str.java | 24 ++++++++++++------ .../dataease/engine/trans/WhereTree2Str.java | 25 ++++++++++++++++--- 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/engine/constant/SQLConstants.java b/core/core-backend/src/main/java/io/dataease/engine/constant/SQLConstants.java index e1aa7542dc..e0ea7fec57 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/constant/SQLConstants.java +++ b/core/core-backend/src/main/java/io/dataease/engine/constant/SQLConstants.java @@ -71,6 +71,8 @@ public class SQLConstants { public static final String WHERE_VALUE_VALUE = "'%s'"; + public static final String WHERE_VALUE_VALUE_CH = "N'%s'"; + public static final String WHERE_NUMBER_VALUE = "%s"; public static final String AGG_COUNT = "COUNT(*)"; diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java index 3d60412acd..4f1d79bf41 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java @@ -17,6 +17,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * @Author Junjun @@ -135,7 +136,11 @@ public class CustomWhere2Str { if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) { if (ObjectUtils.isNotEmpty(item.getEnumValue())) { - res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "N" + "'" + str + "'").collect(Collectors.joining(",")) + "))"; + } else { + res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; + } } } else { if (field.getDeType() == 1 && isCross) { @@ -156,9 +161,17 @@ public class CustomWhere2Str { } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "not_empty")) { whereValue = "''"; } else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) { - whereValue = "('" + String.join("','", value.split(",")) + "')"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "N" + "'" + str + "'").collect(Collectors.joining(",")) + ")"; + } else { + whereValue = "('" + String.join("','", value.split(",")) + "')"; + } } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = "N'%" + value + "%'"; + } else { + whereValue = "'%" + value + "%'"; + } } else { // 如果是时间字段过滤,当条件是等于和不等于的时候转换成between和not between if (field.getDeType() == 1) { @@ -199,7 +212,11 @@ public class CustomWhere2Str { whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); } } else { - whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value); + } else { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); + } } } SQLObj build = SQLObj.builder() diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java index 0beee01a53..158285de95 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java @@ -13,10 +13,8 @@ import io.dataease.extensions.view.dto.ChartExtFilterDTO; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * @Author Junjun @@ -129,10 +127,18 @@ public class ExtWhere2Str { if (value.contains(SQLConstants.EMPTY_SIGN)) { whereValue = "('" + StringUtils.join(value, "','") + "', '')" + " or " + whereName + " is null "; } else { - whereValue = "('" + StringUtils.join(value, "','") + "')"; + if (StringUtils.equalsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")) { + whereValue = "(" + value.stream().map(str -> "N" + "'" + str + "'").collect(Collectors.joining(",")) + ")"; + } else { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } } } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { - whereValue = "'%" + value.get(0) + "%'"; + if (StringUtils.equalsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")) { + whereValue = "N'%" + value.get(0) + "%'"; + } else { + whereValue = "'%" + value.get(0) + "%'"; + } } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { if (request.getDatasetTableField().getDeType() == 1) { if (request.getDatasetTableField().getDeExtractType() == 2 @@ -159,7 +165,11 @@ public class ExtWhere2Str { if (StringUtils.equals(value.get(0), SQLConstants.EMPTY_SIGN)) { whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, "") + " or " + whereName + " is null "; } else { - whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value.get(0)); + if (StringUtils.equalsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")) { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value.get(0)); + } else { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value.get(0)); + } } } list.add(SQLObj.builder() diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java index 23d573bccc..96e02c8d31 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java @@ -18,6 +18,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * @Author Junjun @@ -148,7 +149,11 @@ public class WhereTree2Str { if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) { if (CollectionUtils.isNotEmpty(item.getEnumValue())) { - res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "N" + "'" + str + "'").collect(Collectors.joining(",")) + "))"; + } else { + res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; + } } } else { String value = item.getValue(); @@ -168,9 +173,17 @@ public class WhereTree2Str { } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "not_empty")) { whereValue = "''"; } else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) { - whereValue = "('" + String.join("','", value.split(",")) + "')"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "N" + "'" + str + "'").collect(Collectors.joining(",")) + ")"; + } else { + whereValue = "('" + String.join("','", value.split(",")) + "')"; + } } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { - whereValue = "'%" + value + "%'"; + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = "N'%" + value + "%'"; + } else { + whereValue = "'%" + value + "%'"; + } } else { // 如果是时间字段过滤,当条件是等于和不等于的时候转换成between和not between if (field.getDeType() == 1) { @@ -209,7 +222,11 @@ public class WhereTree2Str { whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); } } else { - whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); + if (StringUtils.equalsIgnoreCase(field.getType(), "NVARCHAR")) { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value); + } else { + whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); + } } } SQLObj build = SQLObj.builder().whereField(whereName).whereTermAndValue(whereTerm + whereValue).build();