J'ai une requête avec Pageable:
Query query = new Query().with(new PageRequests(page, size))
Comment puis-je l'exécuter avec MongoTemplate? Je ne vois pas une seule méthode renvoyer Page<T>
.
MongoTemplate
n'a pas de méthode pour renvoyer Page
. Les méthodes find()
renvoient un List
ordinaire.
with(new PageRequests(page, size)
est utilisé en interne pour ajuster skip
et limit
avec une requête MongoDB (procédée par une requête count je pense)
Page
peut être utilisé conjointement avec référentiels MongoDB qui est un cas spécialisé des référentiels de données Spring.
Ainsi, vous devrez utiliser le Page findAll(Pageable pageable)
de MongoRepository
pour les résultats paginés (en fait hérité de PagingAndSortingRepository
).
Il est vrai que MongoTemplate
n'a pas findXXX
avec Pageables.
Mais vous pouvez utiliser le Spring Repository PageableExecutionUtils
pour cela.
Dans votre exemple, cela ressemblerait à ceci:
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));
Comme dans le référentiel de données Spring original, le PageableExecutionUtils
fera une demande de décompte et l'enveloppera dans un joli Page
pour vous.
Ici vous pouvez voir que le printemps fait de même.
Basé sur la réponse de d0x et en regardant le code ressort . J'utilise cette variation qui fonctionne sur la dépendance Spring-Boot-Starter-Data-Mongodb sans avoir besoin d'ajouter des données communes Spring.
@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));
});