oracle - 由于oracle没有像MySQL一样提供 "limit"和 "offset"函数,Spring Data JPA如何实现与oracle数据库的分页?

标签 oracle spring-data-jpa

Spring Data JPA提供了Pageable和Sorting功能。对于像 MySQL 这样的其他 DBMS,它们本身有“limit”和“offset”函数来为 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();
}

关于oracle - 由于oracle没有像MySQL一样提供 "limit"和 "offset"函数,Spring Data JPA如何实现与oracle数据库的分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45543444/

相关文章:

Oracle 表空间 maxsize "unlimited"并不是真正无限

mysql - 单列与多列设计(针对非主键列)

java - 无论如何,在 spring jpa 中是否有在查询中组合 "contain"和 "or"语义(包含其中之一)?

java - 如何保证 `Spring-Data`中的每一个数据库事务都按顺序执行?

java - 将 JdbcTemplate 与 CrudRepository 混合使用有意义吗?

java - 如果我在更新期间将 json 中的空 id 传递给子实体,为什么 Hibernate 会插入新记录

java - 无法使用 PreparedStatement 的 getGeneratedKeys() 在 Java 中找到生成的 key

sql - Oracle 的加号 (+) 表示法和 ansi JOIN 表示法之间的区别?

使用 Host() 命令的 oracle 过程

java - 为什么 Hibernate 在使用 List 时需要在单向 ManyToMany 中重新创建其他条目