From 7bfacb095b0de1d39bccb54325272c7774dfac1b Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Mon, 1 Mar 2021 22:47:34 +1300 Subject: [PATCH] #2181 - Oracle 9,10,11 rownum based limiting for SqlQuery and DtoQuery (rather than Oracle 12g row limiting) --- .../dbplatform/oracle/Oracle11Platform.java | 1 + .../oracle/OracleRownumBasicLimiter.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 ebean-api/src/main/java/io/ebean/config/dbplatform/oracle/OracleRownumBasicLimiter.java 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(); + } +}