From 53d755c817ef95176d29a2b3be4b7d80d4447de3 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 12 Dec 2023 22:14:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B5=8C=E5=A5=97SQL?= =?UTF-8?q?=E4=B8=ADorder=20by=E5=AD=90=E5=8F=A5=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=88=AA=E6=96=AD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/db/DialectRunner.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java b/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java index 58e4c550c..32355eb25 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/DialectRunner.java @@ -16,6 +16,7 @@ import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.map.MapUtil; +import org.dromara.hutool.core.regex.PatternPool; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.db.dialect.Dialect; import org.dromara.hutool.db.dialect.DialectFactory; @@ -28,6 +29,8 @@ import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 提供基于方言的原始增删改查执行封装 @@ -297,13 +300,15 @@ public class DialectRunner implements Serializable { */ public long count(final Connection conn, final SqlBuilder sqlBuilder) throws DbRuntimeException { checkConn(conn); - String selectSql = sqlBuilder.build(); - // 去除最后的order by 子句 - final int orderByIndex = StrUtil.lastIndexOfIgnoreCase(selectSql, " order by"); - if (orderByIndex > 0) { - selectSql = StrUtil.subPre(selectSql, orderByIndex); + + // 去除order by 子句 + final Pattern pattern = PatternPool.get("(.*?)[\\s]order[\\s]by[\\s][^\\s]+\\s(asc|desc)?", Pattern.CASE_INSENSITIVE); + final Matcher matcher = pattern.matcher(selectSql); + if (matcher.matches()) { + selectSql = matcher.group(1); } + try { return SqlExecutor.queryAndClosePs(dialect.psForCount(conn, SqlBuilder.of(selectSql).addParams(sqlBuilder.getParamValueArray())),