Springアプリケーションでページネーションを実装したい。リポジトリを使用してページネーションを実装できることは知っているが、データ取得用の独自のクエリを作成できないリポジトリには限られたメソッドがあり、クエリクラスを受け入れるメソッドもありません。
Mongodbからデータを取得するカスタムクエリを作成する場合は、mongotemapleteを使用する必要があります。これは、mongotemplateで知っているように、ページ付けを実装できないためです。
Dbクエリと一緒にページネーションを実装する別の方法はありますか?誰でも私を助けることができます。
ご存知のように、MongoTemplateは完全なページ抽象化をサポートしていません。 KneeLessが言ったように、@Query
-アノテーションを使用していくつかのカスタムクエリを実行できます。
これだけでは不十分な場合は、SpringリポジトリPageableExecutionUtils
をMongoTemplateと組み合わせて使用できます。
たとえば、次のようになります。
@Override
public Page<XXX> findSophisticatedXXX(/* params, ... */ @NotNull Pageable pageable) {
Query query = query(
where("...")
// ... sophisticated query ...
).with(pageable);
List<XXX> list = mongoOperations.find(query, XXX.class);
return PageableExecutionUtils.getPage(list, pageable,
() -> mongoOperations.count((Query.of(query).limit(-1).skip(-1), XXX.class));
}
SpringRepositoryも同じことをしています。ご覧のとおり、 ここ 、2つのクエリも実行します。
MongoRepositoryを使用します。 MongoRepositoryを次のように拡張します
public interface FooRepository extends MongoRepository<Foo,String> {
@Query(value="{'name': ?0}");
Page<Foo> findByMethod(String name, Pageable pageable);
}
次に、それをとして使用します
Page fooPage = FooRepository.findByMethod('John', new PageRequest(0,20));
誰かがそれを必要とする場合に備えてそれを出すだけです。
SpringDataには、カスタムクエリのメソッドがあります。
final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
Spring Data PagingAndSortingRepository インターフェースを拡張することにより、save、find、findAll、deleteなどの一般的なメソッドを取得でき、独自のカスタムクエリを追加することもできます。
public interface Repository extends PagingAndSortingRepository<Book, ID extends Serializable> {
// Common method
Page<Book> findAll(Pageable pageable);
// Custom query based on Spring Data naming convention
Page<Book> findByNameOrDescription(String name, String description, Pageable pageable);
}