Spring Data JPA如何通过oracle数据库实现分页,因为oracle不提供像MySQL那样"limit"和"offset"功能?



Spring Data JPA提供了可分页和排序功能。对于其他DBMS,如MySQL,它们本身有"限制"和"偏移"函数,可以为Spring提供SQL级别的分页。我想知道Spring Data JPA如何处理Oracle数据库的分页,因为Oracle没有相同的功能。 请让我知道我可以在 Spring 的源代码中在哪里找到这样的实现。 实现会有性能问题吗?

来自Hibernate的Github存储库,OracleDialect.java:

@Override
public String getLimitString(String sql, boolean hasOffset) {
sql = sql.trim();
boolean isForUpdate = false;
if ( sql.toLowerCase(Locale.ROOT).endsWith( " for update" ) ) {
sql = sql.substring( 0, sql.length()-11 );
isForUpdate = true;
}
final StringBuilder pagingSelect = new StringBuilder( sql.length()+100 );
if (hasOffset) {
pagingSelect.append( "select * from ( select row_.*, rownum rownum_ from ( " );
}
else {
pagingSelect.append( "select * from ( " );
}
pagingSelect.append( sql );
if (hasOffset) {
pagingSelect.append( " ) row_ ) where rownum_ <= ? and rownum_ > ?" );
}
else {
pagingSelect.append( " ) where rownum <= ?" );
}
if ( isForUpdate ) {
pagingSelect.append( " for update" );
}
return pagingSelect.toString();
}