diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/OracleDialect.java b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/OracleDialect.java index 06f822a46..de67b8612 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/OracleDialect.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/OracleDialect.java @@ -12,6 +12,7 @@ package org.dromara.hutool.db.dialect.impl; +import org.dromara.hutool.core.text.StrPool; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.db.Page; import org.dromara.hutool.db.dialect.DialectName; @@ -25,6 +26,10 @@ import org.dromara.hutool.db.sql.SqlBuilder; public class OracleDialect extends AnsiSqlDialect { private static final long serialVersionUID = 6122761762247483015L; + private static final String DEFAULT_TABLE_ALIAS = "table_alias_"; + private static final String DEFAULT_ROW_ALIAS = "row_"; + private static final String DEFAULT_ROWNUM_ALIAS = "rownum_"; + /** * 检查字段值是否为Oracle自增字段,自增字段以`.nextval`结尾 * @@ -36,6 +41,9 @@ public class OracleDialect extends AnsiSqlDialect { return (value instanceof CharSequence) && StrUtil.endWithIgnoreCase(value.toString(), ".nextval"); } + /** + * 构造 + */ public OracleDialect() { //Oracle所有字段名用双引号包围,防止字段名或表名与系统关键字冲突 //wrapper = new Wrapper('"'); @@ -44,11 +52,27 @@ public class OracleDialect extends AnsiSqlDialect { @Override protected SqlBuilder wrapPageSql(final SqlBuilder find, final Page page) { final int[] startEnd = page.getStartEnd(); + + // 检查别名,避免重名 + final String sql = find.toString(); + String tableAlias = DEFAULT_TABLE_ALIAS; + while (sql.contains(tableAlias)) { + tableAlias += StrPool.UNDERLINE; + } + String rowAlias = DEFAULT_ROW_ALIAS; + while (sql.contains(rowAlias)) { + rowAlias += StrPool.UNDERLINE; + } + String rownumAlias = DEFAULT_ROWNUM_ALIAS; + while (sql.contains(rownumAlias)) { + rownumAlias += StrPool.UNDERLINE; + } + return find - .insertPreFragment("SELECT * FROM ( SELECT row_.*, rownum rownum_ from ( ") - .append(" ) row_ where rownum <= ").append(startEnd[1])// - .append(") table_alias_")// - .append(" where table_alias_.rownum_ > ").append(startEnd[0]);// + .insertPreFragment("SELECT * FROM ( SELECT " + rowAlias + ".*, rownum " + rownumAlias + " from ( ") + .append(" ) row_ where rownum <= ").append(startEnd[1])// + .append(") ").append(tableAlias)// + .append(" where ").append(tableAlias).append(".rownum_ > ").append(startEnd[0]);// } @Override