web-dev-qa-db-ja.com

ページング可能なSpringカスタムクエリ

Springアプリケーションでページネーションを実装したい。リポジトリを使用してページネーションを実装できることは知っているが、データ取得用の独自のクエリを作成できないリポジトリには限られたメソッドがあり、クエリクラスを受け入れるメソッドもありません。

Mongodbからデータを取得するカスタムクエリを作成する場合は、mongotemapleteを使用する必要があります。これは、mongotemplateで知っているように、ページ付けを実装できないためです。

Dbクエリと一緒にページネーションを実装する別の方法はありますか?誰でも私を助けることができます。

11
Trivikrama

ご存知のように、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つのクエリも実行します。

21
d0x

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));
9
KneeLess

誰かがそれを必要とする場合に備えてそれを出すだけです。

SpringDataには、カスタムクエリのメソッドがあります。

final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
6
Jack

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);

}
2
Chazar