2015-03-13 10 views
9

Ich habe eine Abfrage mit Pageable:Paginierung mit mongoTemplate

Query query = new Query().with(new PageRequests(page, size)) 

Wie kann ich es mit MongoTemplate ausführen? Ich sehe keine einzige Methode, die Page<T> zurückgibt.

Antwort

5

MongoTemplate hat keine Methoden zur Rückgabe Page. Die find() Methoden geben einen gewöhnlichen List zurück.

with(new PageRequests(page, size) intern anzupassen skip und limit mit MongoDB Abfrage (ging durch eine Zählung Abfrage Ich denke)

Page kann verwendet werden, in Verbindung mit MongoDB repositories verwendet, die ein Spezialfall von Spring Data Repositories ist.

So müssen Sie MongoRepositoryPage findAll(Pageable pageable) für paginierte Ergebnisse verwenden (tatsächlich von PagingAndSortingRepository vererbt).

4

Es stimmt, dass die MongoTemplate keine mit Pageables hat.

Aber Sie können das Spring Repository PageableExecutionUtils dafür verwenden.

In Ihrem Beispiel würde es so aussehen:

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, XXX.class)); 

Wie im Original Spring Data Repository, das PageableExecutionUtils wird eine Zählung Antrag tun und es in eine schönes Page Sie einpacken.

Here können Sie sehen, dass der Frühling das gleiche tut.

+0

und wo ist die Klasse PageableExecutionUtils? –

+0

From Spring Daten commons: https://github.com/spring-projects/spring-data-commons/blob/master/src/main/java/org/springframework/data/repository/support/PageableExecutionUtils.java – d0x

+0

Ok, Vielen Dank. Ich habe eine ältere Version des Frühlings benutzt. –

0

Basierend auf d0x Antwort und Blick auf die spring code. Ich verwende diese Variante, die von der Spring-Boot-Starter-Data-Mongodb-Abhängigkeit ausgeht, ohne Spring-Data-Commons hinzufügen zu müssen.

@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; 
}