Skip to content

Commit 6bd265e

Browse files
authored
Merge pull request #223 from cs304-spring2021/master
尝试修复 oracle select 分页语法问题
2 parents 46436c5 + 08a3125 commit 6bd265e

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

+11-7
Original file line numberDiff line numberDiff line change
@@ -1473,17 +1473,17 @@ public String getLimitString() {
14731473
if (count <= 0 || RequestMethod.isHeadMethod(getMethod(), true)) {
14741474
return "";
14751475
}
1476-
return getLimitString(getPage(), getCount(), isOracle() || isSQLServer() || isDb2());
1476+
return getLimitString(getPage(), getCount(), isOracle() || isSQLServer() || isDb2(), isOracle());
14771477
}
14781478
/**获取限制数量
14791479
* @param limit
14801480
* @return
14811481
*/
1482-
public static String getLimitString(int page, int count, boolean isTSQL) {
1482+
public static String getLimitString(int page, int count, boolean isTSQL, boolean isOracle) {
14831483
int offset = getOffset(page, count);
14841484

1485-
if (isTSQL) { // OFFSET FECTH 中所有关键词都不可省略
1486-
return " OFFSET " + offset + " ROWS FETCH FIRST " + count + " ROWS ONLY";
1485+
if (isTSQL) { // OFFSET FECTH 中所有关键词都不可省略, 另外 Oracle 数据库使用子查询加 where 分页
1486+
return isOracle? " WHERE ROWNUM BETWEEN "+ offset +" AND "+ (offset + count): " OFFSET " + offset + " ROWS FETCH FIRST " + count + " ROWS ONLY";
14871487
}
14881488

14891489
return " LIMIT " + count + (offset <= 0 ? "" : " OFFSET " + offset); // DELETE, UPDATE 不支持 OFFSET
@@ -2613,8 +2613,12 @@ public static String getSQL(AbstractSQLConfig config) throws Exception {
26132613

26142614
config.setPreparedValueList(new ArrayList<Object>());
26152615
String column = config.getColumnString();
2616-
return explain + "SELECT " + (config.getCache() == JSONRequest.CACHE_RAM ? "SQL_NO_CACHE " : "") + column + " FROM " + getConditionString(column, tablePath, config);
2617-
}
2616+
if(config.isOracle()){
2617+
//When config's database is oracle,Using subquery since Oracle12 below does not support OFFSET FETCH paging syntax.
2618+
return explain + "SELECT * FROM (SELECT"+ (config.getCache() == JSONRequest.CACHE_RAM ? "SQL_NO_CACHE " : "") + column + " FROM "+getConditionString(column, tablePath, config)+ ") "+config.getLimitString();
2619+
}else
2620+
return explain + "SELECT " + (config.getCache() == JSONRequest.CACHE_RAM ? "SQL_NO_CACHE " : "") + column + " FROM " + getConditionString(column, tablePath, config);
2621+
}
26182622
}
26192623

26202624
/**获取条件SQL字符串
@@ -2641,7 +2645,7 @@ private static String getConditionString(String column, String table, AbstractSQ
26412645

26422646
//no need to optimize
26432647
// if (config.getPage() <= 0 || ID.equals(column.trim())) {
2644-
return condition + config.getLimitString();
2648+
return config.isOracle()? condition:condition + config.getLimitString();
26452649
// }
26462650
//
26472651
//

0 commit comments

Comments
 (0)