2017-08-07 11 views
1

スプリングデータJPAにはPageable機能とSorting機能があります。 MySQLのような他のDBMSでは、Springに対してSQLレベルのページ設定を提供するための "制限"機能と "オフセット"機能があります。私はSpring Data JPAがOracleと同じようにOracleデータベースとページングを処理する方法が同じ機能を持っていないのだろうかと思っています。 Springのソースコードでどこでこのような実装を見つけることができるか教えてください。実装にパフォーマンスの問題がありますか?oracleはMySQLのように "制限"と "オフセット"機能を提供していないため、SpringデータJPAがoracleデータベースでページングを実装する方法は?

HibernateのGithubのレポから
+0

それはSDJは、ROWNUM/ROW_NUMBER()を使用しているようだ、何がhttp://www.baeldung.com/jpa-pagination/#comment-7469 – Cepr0

+0

で見ますあなたのデータベースのバージョン?私が間違っていない場合、12cには制限やオフセットなどの機能があります。 – user75ponic

+0

@ user75ponic私はオラクルが "限界"と "オフセット"をサポートしていないと述べたと思います。あなたはその質問について考えていますか? – linc01n

答えて

2

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(); 
} 
+0

こんにちは@Brian、とても役に立ちます。どのようにこれを見つけるのですか?メソッドhibernateがoracleのページネゴシエーションを処理していることを確認した後、大規模なデータセットではパフォーマンス上の問題が発生する可能性があります。 – linc01n

関連する問題