From 76e52e8eaed5f98f2defb6a84d8b74e9f4d7f1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=98=93=E4=BB=80=E4=B9=88=E6=9D=A5=E7=9D=80?= <1931236+mysmlz@user.noreply.gitee.com> Date: Thu, 30 Sep 2021 00:37:56 +0000 Subject: [PATCH 1/2] =?UTF-8?q?update=20src/main/java/com/thinkgem/jeesite?= =?UTF-8?q?/common/persistence/interceptor/SQLHelper.java.=20=E5=AF=B9sql?= =?UTF-8?q?=20server=E8=AF=AD=E5=8F=A5=E4=B8=AD=E5=B7=B2=E6=9C=89=E7=9A=84?= =?UTF-8?q?ROW=5FNUMBER=20(=20)=20OVER=20(=20partition=20by=20xx=20order?= =?UTF-8?q?=20by=20xx)=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/interceptor/SQLHelper.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/thinkgem/jeesite/common/persistence/interceptor/SQLHelper.java b/src/main/java/com/thinkgem/jeesite/common/persistence/interceptor/SQLHelper.java index a82d4e12c..6b26d64eb 100644 --- a/src/main/java/com/thinkgem/jeesite/common/persistence/interceptor/SQLHelper.java +++ b/src/main/java/com/thinkgem/jeesite/common/persistence/interceptor/SQLHelper.java @@ -181,15 +181,37 @@ public class SQLHelper { * @return */ @SuppressWarnings("unused") - private static String removeOrders(String qlString) { - Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE); - Matcher m = p.matcher(qlString); - StringBuffer sb = new StringBuffer(); - while (m.find()) { - m.appendReplacement(sb, ""); + private static String removeOrders(String sqlString) { + String dbName = Global.getConfig("jdbc.type"); + //存储每个partition + List partitionGroups = new ArrayList<>(); + if ("mssql".equals(dbName)) { + //替换mssql中的partition操作 + Pattern partitionPattern = + Pattern.compile("(?<=ROW_NUMBER[\\s|\\S]?\\([\\s|\\S]?\\)[\\s|\\S]?OVER[\\s|\\S]?\\()[^\\)]+", + Pattern.CASE_INSENSITIVE); + Matcher partitionMatcher = partitionPattern.matcher(sqlString); + while (partitionMatcher.find()) { + partitionGroups.add(partitionMatcher.group()); + } + sqlString = partitionMatcher.replaceAll("{{partition}}"); + } + Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(sqlString); + sqlString = m.replaceAll(""); + if ("mssql".equals(dbName)) { + //还原每个partition + Pattern p1 = Pattern.compile("\\{\\{partition\\}\\}", Pattern.CASE_INSENSITIVE); + Matcher m1 = p1.matcher(sqlString); + StringBuffer stringBuffer = new StringBuffer(); + int j = 0; + while (m1.find()) { + m1.appendReplacement(stringBuffer, partitionGroups.get(j)); + } + m1.appendTail(stringBuffer); + sqlString = stringBuffer.toString(); } - m.appendTail(sb); - return sb.toString(); + return sqlString; } } -- Gitee From 34c315f444c1e509ca1f083ed7f13afe5f1a7507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=98=93=E4=BB=80=E4=B9=88=E6=9D=A5=E7=9D=80?= <1931236+mysmlz@user.noreply.gitee.com> Date: Thu, 30 Sep 2021 00:39:22 +0000 Subject: [PATCH 2/2] =?UTF-8?q?update=20src/main/java/com/thinkgem/jeesite?= =?UTF-8?q?/common/persistence/dialect/db/SQLServer2005Dialect.java.=20?= =?UTF-8?q?=E5=AF=B9sql=20server=E8=AF=AD=E5=8F=A5=E4=B8=AD=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E7=9A=84ROW=5FNUMBER=20(=20)=20OVER=20(=20partition?= =?UTF-8?q?=20by=20xx=20order=20by=20xx)=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 获取最后一个order by --- .../common/persistence/dialect/db/SQLServer2005Dialect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thinkgem/jeesite/common/persistence/dialect/db/SQLServer2005Dialect.java b/src/main/java/com/thinkgem/jeesite/common/persistence/dialect/db/SQLServer2005Dialect.java index 7da688e7e..29a363ab1 100644 --- a/src/main/java/com/thinkgem/jeesite/common/persistence/dialect/db/SQLServer2005Dialect.java +++ b/src/main/java/com/thinkgem/jeesite/common/persistence/dialect/db/SQLServer2005Dialect.java @@ -83,7 +83,7 @@ public class SQLServer2005Dialect implements Dialect { static String getOrderByPart(String sql) { String loweredString = sql.toLowerCase(); - int orderByIndex = loweredString.indexOf("order by"); + int orderByIndex = loweredString.lastIndexOf("order by"); if (orderByIndex != -1) { // if we find a new "order by" then we need to ignore // the previous one since it was probably used for a subquery -- Gitee