diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/Oracle11Platform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/Oracle11Platform.java index e13155f3f..cb32a7470 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/Oracle11Platform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/Oracle11Platform.java @@ -13,6 +13,7 @@ public class Oracle11Platform extends OraclePlatform { this.platform = Platform.ORACLE11; this.columnAliasPrefix = "c"; this.sqlLimiter = new OracleRownumSqlLimiter(); + this.basicSqlLimiter = new OracleRownumBasicLimiter(); dbIdentity.setIdType(IdType.SEQUENCE); } } diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleRownumBasicLimiter.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleRownumBasicLimiter.java new file mode 100644 index 000000000..e51df98cb --- /dev/null +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleRownumBasicLimiter.java @@ -0,0 +1,35 @@ +package io.ebean.config.dbplatform.oracle; + +import io.ebean.config.dbplatform.BasicSqlLimiter; + +/** + * Row limiter for Oracle 9,10,11 using rownum. + */ +public class OracleRownumBasicLimiter implements BasicSqlLimiter { + + @Override + public String limit(String dbSql, int firstRow, int maxRows) { + if (firstRow < 1 && maxRows < 1) { + return dbSql; + } + StringBuilder sb = new StringBuilder(60 + dbSql.length()); + int lastRow = maxRows; + if (lastRow > 0) { + lastRow += firstRow; + } + sb.append("select * from (select "); + if (maxRows > 0) { + sb.append("/*+ FIRST_ROWS(").append(maxRows).append(") */ "); + } + sb.append("a.*, rownum rn_ from ("); + sb.append(dbSql).append(") a "); + if (lastRow > 0) { + sb.append(" where rownum <= ").append(lastRow); + } + sb.append(") "); + if (firstRow > 0) { + sb.append(" where rn_ > ").append(firstRow); + } + return sb.toString(); + } +}