web-dev-qa-db-fra.com

Comment appliquer la pagination dans les données de printemps réactives?

Dans Spring Data, nous avons PagingAndSortingRepository qui hérite de CrudRepository. Dans les données de printemps réactives, nous n'avons que ReactiveSortingRepository qui hérite de ReactiveCrudRepository. Comment pourrions-nous faire de la pagination de manière réactive? Pouvons-nous faire cela à l'avenir avec ReactivePagingAndSortingRepository par exemple?

6
Steph

Les référentiels MongoDB de données réactives réactives ne fournissent pas de pagination dans le sens de pagination comment elle est conçue pour les référentiels impératifs. La pagination impérative nécessite des informations supplémentaires lors de la récupération d'une page. En particulier:

  • Le nombre d'enregistrements renvoyés pour une requête de pagination
  • Eventuellement, nombre total d'enregistrements générés par la requête si le nombre d'enregistrements renvoyés est égal à zéro ou correspond à la taille de la page pour calculer le nombre total de pages.

Les deux aspects ne correspondent pas à la notion d'utilisation efficace et non bloquante des ressources. Attendre la réception de tous les enregistrements (pour déterminer le premier bloc de détails de pagination) supprime une grande partie des avantages que vous obtenez grâce à un accès réactif aux données. En outre, l'exécution d'une requête de comptage est plutôt coûteuse et augmente le délai jusqu'à ce que vous soyez capable de traiter des données.

Vous pouvez toujours récupérer vous-même des morceaux de données en transmettant une Pageable (PageRequest) aux méthodes de requête du référentiel:

interface ReactivePersonRepository extends Repository<Person, Long> {

  Flux<Person> findByFirstnameOrderByLastname(String firstname, Pageable pageable);
}

Spring Data appliquera la pagination à la requête en traduisant Pageable en LIMIT et OFFSET.

Références:

8
mp911de
import com.thepracticaldeveloper.reactiveweb.domain.Quote;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;

public interface QuoteMongoReactiveRepository extends ReactiveCrudRepository<Quote, String> {

    @Query("{ id: { $exists: true }}")
    Flux<Quote> retrieveAllQuotesPaged(final Pageable page);
}

plus de détails, vous pouvez vérifier ici

2
kn3l