Pageableを使用したクエリがあります。
Query query = new Query().with(new PageRequests(page, size))
MongoTemplateでどのように実行できますか? Page<T>
を返す単一のメソッドがありません。
MongoTemplate
には、Page
を返すメソッドがありません。 find()
メソッドは通常のList
を返します。
with(new PageRequests(page, size)
は、MongoDBクエリを使用してskip
およびlimit
を調整するために内部的に使用されます(カウントクエリによって処理されると思います)
Page
は、Springデータリポジトリの特殊なケースである MongoDB repositories と組み合わせて使用できます。
したがって、ページ付けされた結果(実際にはMongoRepository
から継承)にはPagingAndSortingRepository
のPage findAll(Pageable pageable)
を使用する必要があります。
MongoTemplate
にPageablesのあるfindXXX
がないことは事実です。
ただし、SpringリポジトリPageableExecutionUtils
を使用できます。
あなたの例では次のようになります:
Pageable pageable = new PageRequests(page, size);
Query query = new Query().with(pageable);
List<XXX> list = mongoTemplate.find(query, XXX.class);
return PageableExecutionUtils.getPage(
list,
pageable,
() -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), XXX.class));
元のSpring Data Repositoryと同様に、PageableExecutionUtils
はカウントリクエストを実行し、Nice Page
にラップします。
ここ 春も同じように動いていることがわかります。
D0xの回答に基づいて 春のコード を確認します。私はこのバリエーションを使用しています。このバリエーションは、spring-data-commonを追加する必要なしに、spring-boot-starter-data-mongodb依存関係を解消します。
@Autowired
private MongoOperations mongoOperations;
@Override
public Page<YourObjectType> searchCustom(Pageable pageable) {
Query query = new Query().with(pageable);
// Build your query here
List<YourObjectType> list = mongoOperations.find(query, YourObjectType.class);
long count = mongoOperations.count(query, YourObjectType.class);
Page<YourObjectType> resultPage = new PageImpl<YourObjectType>(list , pageable, count);
return resultPage;
}
return type Mono<Page<Myobject>>...
return this.myobjectRepository.count()
.flatMap(ptiCount -> {
return this.myobjectRepository.findAll(pageable.getSort())
.buffer(pageable.getPageSize(),(pageable.getPageNumber() + 1))
.elementAt(pageable.getPageNumber(), new ArrayList<>())
.map(ptis -> new PageImpl<Myobject>(ptis, pageable, ptiCount));
});