This commit is contained in:
Looly 2024-01-10 11:57:38 +08:00
parent 8205a8b03a
commit c60f30361e

View File

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