web-dev-qa-db-ja.com

ユーザー定義のオフセットと制限(範囲)を使用してSpringデータJPAを介してデータをクエリする方法

ユーザー定義の範囲[intstarting record -int last record]のデータをフェッチすることは可能ですか?

私の場合ユーザーが定義しますクエリ文字列で範囲データをフェッチしたい。私はこのようなことを試しました

Pageable pageable = new PageRequest(0, 10);
    Page<Project> list = projectRepository.findAll(spec, pageable);

仕様は私の定義した仕様ですが、残念ながらこれは役に立ちません。ここで何か間違ったことをしているのかもしれません。

他のSpringJPAが提供するメソッドを見たことがありますが、あまり役に立ちません。

ユーザーは次のように入力できますlocalhost:8080/Section/employee?range {"columnName":name、 "from":6、 "to":20}

したがって、これは従業員データをフェッチすることを意味し、最初の15レコード(columnNameでソート)をフェッチすることは今のところ重要ではありません。

何か良いことを提案していただければ幸いです。十分な情報が提供されていないと思われる場合は、お知らせください。必要な情報を提供します。

更新:ネイティブまたはCreateクエリステートメントを使用したくない(他のオプションがなくなるまで)。このようなものかもしれません:

Pageable pageable = new PageRequest(0, 10);
        Page<Project> list = projectRepository.findAll(spec, new pageable(int startIndex,int endIndex){
// here my logic.

});

より良い選択肢があれば、私にもそれを提案することができます。

ありがとう。

10
lesnar

new PageRequest(0, 10);があなたの考えを実行しないため、あなたのアプローチは機能しませんでした。 docs で述べられているように、入力引数はpagesizeであり、制限とオフセットではありません。

私の知る限り(そして私が間違っていれば誰かが私を訂正してくれます)、デフォルトのSrpingDataリポジトリで必要なものに対する「すぐに使える」サポートはありません。ただし、制限/オフセットパラメータを使用するPagableのカスタム実装を作成できます。これが基本的な例です- Spring data Pageable and LIMIT/OFFSET

10
Kejml

これは、ページネーションを使用して、データベーステーブルの列名、値、および行数を次のように設定することで実行できます:

 @Transactional(readOnly=true)
 public List<String> queryEmployeeDetails(String columnName,String columnData, int startRecord, int endRecord) {
    Query query =  sessionFactory.getCurrentSession().createQuery(" from Employee emp where emp.col= :"+columnName);
    query.setParameter(columnName, columnData);
    query.setFirstResult(startRecord);
    query.setMaxResults(endRecord);
    List<String> list = (List<String>)query.list();
    return list;
}
4
developer

だから私は提案された答えの1つとしてこれを機能させました、私は自分のPageableを実装してオーバーライドしましたgetPagesize()getOffset()getSort() =それだけです(私の場合、これ以上は必要ありませんでした)

_public Range(int startIndex, int endIndex, String sortBy) {
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.sortBy = sortBy;
    }

    @Override
    public int getPageSize() {
        if (endIndex == 0)
            return 0;
        return endIndex - startIndex;
    }

    @Override
    public int getOffset() {
        // TODO Auto-generated method stub
        return startIndex;
    }

    @Override
    public Sort getSort() {
        // TODO Auto-generated method stub
        if (sortBy != null && !sortBy.equalsIgnoreCase(""))
            return new Sort(Direction.ASC, sortBy);
        else
            return new Sort(Direction.ASC, "id");
    }
_

ここで、startIndexendIndexは、レコードの開始および最後のインデックスです。

アクセスするには:

repository.findAll(spec,new Range(0,20,"id");

1
lesnar

私があなたの問題を正しく理解しているなら、あなたはあなたのリポジトリがユーザーにできるようにしたいです

  1. クエリの基準を提供します(Specificationを介して)
  2. 並べ替える列を指定する
  3. 取得する結果の範囲を指定します。

私の理解が正しければ、次のようになります。

1.を達成するために、Spring DataJPAのJpaSpecificationExecutorを利用できます。これにより、クエリにSpecificiationを渡すことができます。

JpaSpecificationExecutorでは、2と3の両方をPagableを使用して実現できます。 Pageableを使用すると、クエリの開始インデックス、レコード数、および並べ替え列を指定できます。範囲ベースのPageableを実装する必要があります。 PageRequestは、実装できるもの(または、私が信じていることを拡張できるもの)に関する優れたリファレンスです。

1
Adrian Shum