当前位置: 首页 > 知识库问答 >
问题:

既然oracle没有像MySQL那样提供“限制”和“偏移量”功能,Spring Data JPA如何实现与oracle数据库的分页?

郎宏浚
2023-03-14

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

共有1个答案

吴胜
2023-03-14

来自Hibernate的Github repo,OracleDialt.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产生数据业务数据,需要同于到mysql数据库中用于查询, 可以实时或异步,延时时间不要太长就好。而且两个库里的表结构,不一定相同,需要做简单加工。 目前的想法,就是定时任务服务,2个数据源,先查oracle再写mysql 还有什么牛逼的方案吗?

  • 我希望用户能够在我的查询方法中指定限制(返回量的大小)和偏移量(返回的第一条记录/返回的索引)。 这里是我没有任何分页功能的类。我的实体: 我的仓库: 我的服务界面: 我的服务实施: 现在,我尝试提供支持偏移和限制的分页功能。我的实体类保持不变。 我的“新”存储库接受一个可分页的参数: 我的“新”服务接口包含两个附加参数: 我的“新”服务实现: 然而,这不是我想要的。PageRequest指定页面

  • 主要内容:数据库和实例Oracle数据库是Oracle公司开发和销售的一种对象关系数据库管理系统。 Oracle数据库通常被称为Oracle RDBMS或简称为Oracle。 数据库和实例 Oracle数据库服务器由一个数据库和至少一个数据库实例组成。 数据库是一组存储数据的文件,而数据库实例是一组管理数据库文件的内存结构。 另外,数据库由后台进程组成。 一个数据库和一个实例是紧密相连的,因此术语 - Oracle数据

  • Oracle .NET 团队正在评估 EF Core 支持,但还没有宣布任何时间点。你可以在 Oracle EF Core 提供程序请求 上进行表决。 请直接向 Oracle 社区站点 询问关于此提供商的任何问题,包括发布时间表。

  • 问题内容: 有没有像MySQL中的任何功能和像甲骨文和其他DBMS提供的? 我想在查询中生成一个ID,但是在MySQL中这些功能不存在。还有其他选择吗? 问题答案: Mysql没有它们,但是您可以使用使用用户定义的变量的以下表达式进行模拟: 像这样: 但是如果您要重用该会话,它将仍然被设置,因此您需要像这样重置它: 参见SQLFiddle。 可能,但是火车残骸;我建议在应用程序层处理该要求。

  • 目前,我们有一个数据库运行在Oracle 10g(10.2.0.2)上,需要全天候运行,但由于数据中心不支持它,服务器OS和Oracle数据库10g,我们不得不按照上级的协议转移到Oracle 12c。我知道我不能使用从10.2.0.2到12.2.0.1的直接expdp/impdp。并且资源有限,这意味着服务器资源有限,无法访问oracle支持以下载oracle 10.2.0.5修补程序集或任何可