diff --git a/CHANGELOG.md b/CHANGELOG.md index 6925b203c..449d27dee 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ * 【core 】 修复ImgUtil.convert png转jpg在jdk9+中失败问题(issue#I8L8UA@Gitee) * 【cache 】 修复StampedCache的get方法非原子问题(issue#I8MEIX@Gitee) * 【core 】 修复StrSplitter.splitByRegex使用空参数导致的OOM问题(issue#3421@Github) +* 【db 】 修复嵌套SQL中order by子句错误截断问题(issue#I89RXV@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.23(2023-11-12) diff --git a/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java index a891f3ba8..c0c7906e6 100644 --- a/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java +++ b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java @@ -1,8 +1,11 @@ package cn.hutool.db; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.PatternPool; +import cn.hutool.core.lang.RegexPool; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.dialect.Dialect; import cn.hutool.db.dialect.DialectFactory; @@ -18,6 +21,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; /** * 提供基于方言的原始增删改查执行封装 @@ -273,11 +278,14 @@ public class DialectRunner implements Serializable { checkConn(conn); String selectSql = sqlBuilder.build(); + // 去除order by 子句 - final int orderByIndex = StrUtil.lastIndexOfIgnoreCase(selectSql, " order by"); - if (orderByIndex > 0) { - selectSql = StrUtil.subPre(selectSql, orderByIndex); + 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); } + return SqlExecutor.queryAndClosePs(dialect.psForCount(conn, SqlBuilder.of(selectSql).addParams(sqlBuilder.getParamValueArray())), new NumberHandler()).longValue();