ユーザー定義の範囲[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.
});
より良い選択肢があれば、私にもそれを提案することができます。
ありがとう。
new PageRequest(0, 10);
があなたの考えを実行しないため、あなたのアプローチは機能しませんでした。 docs で述べられているように、入力引数はpage
とsize
であり、制限とオフセットではありません。
私の知る限り(そして私が間違っていれば誰かが私を訂正してくれます)、デフォルトのSrpingDataリポジトリで必要なものに対する「すぐに使える」サポートはありません。ただし、制限/オフセットパラメータを使用するPagable
のカスタム実装を作成できます。これが基本的な例です- Spring data Pageable and LIMIT/OFFSET
これは、ページネーションを使用して、データベーステーブルの列名、値、および行数を次のように設定することで実行できます:
@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;
}
だから私は提案された答えの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");
}
_
ここで、startIndex、endIndexは、レコードの開始および最後のインデックスです。
アクセスするには:
repository.findAll(spec,new Range(0,20,"id");
私があなたの問題を正しく理解しているなら、あなたはあなたのリポジトリがユーザーにできるようにしたいです
Specification
を介して)私の理解が正しければ、次のようになります。
1.を達成するために、Spring DataJPAのJpaSpecificationExecutor
を利用できます。これにより、クエリにSpecificiation
を渡すことができます。
JpaSpecificationExecutor
では、2と3の両方をPagable
を使用して実現できます。 Pageable
を使用すると、クエリの開始インデックス、レコード数、および並べ替え列を指定できます。範囲ベースのPageable
を実装する必要があります。 PageRequest
は、実装できるもの(または、私が信じていることを拡張できるもの)に関する優れたリファレンスです。