Pagination et tri à l’aide de Spring Data JPA

Pagination et tri à l'aide de Spring Data JPA

1. Vue d'ensemble

La pagination est souvent utile lorsque nous avons un grand jeu de données et que nous souhaitons le présenter à l'utilisateur sous forme de fragments plus petits.

En outre, nous devons souvent trier ces données selon certains critères lors de la pagination.

Dans ce didacticiel,we’ll learn how to easily paginate and sort using Spring Data JPA.

Lectures complémentaires:

Données de printemps JPA @Query

Apprenez à utiliser l'annotation @Query dans Spring Data JPA pour définir des requêtes personnalisées à l'aide de JPQL et de SQL natif.

Read more

Méthodes de requête dérivées dans les référentiels JPA de Spring Data

Explorez le mécanisme de dérivation de requête dans Spring Data JPA.

Read more

2. La configuration initiale

Tout d'abord, disons que nous avons une entitéProduct:

@Entity
public class Product {

    @Id
    private long id;
    private String name;
    private double price;

    // constructors, getters and setters

}

comme notre classe de domaine. Chacune de nos instancesProduct a un identifiant unique -id, sesname et sesprice qui lui sont associés.

3. Création d'un référentiel

Pour accéder à nosProduct, nous aurons besoin d'unProductRepository:

public interface ProductRepository extends PagingAndSortingRepository {

    List findAllByPrice(double price, Pageable pageable);
}

En lui faisant étendrePagingAndSortingRepository, we get findAll(Pageable pageable) and findAll(Sort sort) methods for paging and sorting.

Ou, nous aurions pu choisir d'étendreJpaRepository à la place, car il étend égalementPagingAndSortingRepository.

Une fois que nous étendonsPagingAndSortingRepository,we can add our own methods that take Pageable and Sort as parameters, comme nous l'avons fait ici avecfindAllByPrice.

Voyons comment paginer nosProducts en utilisant notre nouvelle méthode.

4. Pagination

Une fois que notre référentiel s'étend à partir dePagingAndSortingRepository, il suffit de:

  1. Créer ou obtenir un objetPageRequest, qui est une implémentation de l'interfacePageable

  2. Passez l'objetPageRequest comme argument à la méthode de référentiel que nous avons l'intention d'utiliser

Nous pouvons créer un objetPageRequest en passant le numéro de page demandé et la taille de la page.

Ici,the page counts starts at zero:

Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

Pageable secondPageWithFiveElements = PageRequest.of(1, 5);

Dans Spring MVC, nous pouvons également choisir d'obtenir l'instancePageable dans notre contrôleur en utilisantSpring Data Web Support.

Une fois que nous avons notre objetPageRequest \, nous pouvons le passer en invoquant la méthode de notre référentiel:

Page allProducts = productRepository.findAll(firstPageWithTwoElements);

List allTenDollarProducts =
  productRepository.findAllByPrice(10, secondPageWithFiveElements);

La méthodefindAll(Pageable pageable) renvoie par défaut un objetPage<T>.

Cependant,we can choose to return either a Page<T>, a Slice<T> or a List<T> from any of our custom methods returning a paginated data.

Une instancePage<T>, en plus d'avoir la liste desProducts, connaît également le nombre total de pages disponibles. It triggers an additional count query to achieve it. To avoid such an overhead cost, we can instead return a Slice<T> or a List<T>.

UnSlice sait seulement si la tranche suivante est disponible ou non.

5. Pagination et Tri

De même, pour avoir simplement les résultats de notre requête triés, nous pouvons simplementpass an instance of Sort à la méthode:

Page allProductsSortedByName = productRepository.findAll(Sort.by("name"));

Cependant, que faire si nous voulonsboth sort and page our data?

Nous pouvons le faire en passant les détails du tri dans notre objetPageRequest lui-même:

Pageable sortedByName =
  PageRequest.of(0, 3, Sort.by("name"));

Pageable sortedByPriceDesc =
  PageRequest.of(0, 3, Sort.by("price").descending());

Pageable sortedByPriceDescNameAsc =
  PageRequest.of(0, 5, Sort.by("price").descending().and(Sort.by("name")));

En fonction de nos exigences de tri,we can specify the sort fields and the sort direction lors de la création de notre instancePageRequest.

Comme d'habitude, nous pouvons ensuite passer cette instance de typePageable à la méthode du référentiel.

6. Conclusion

Dans cet article, nous avons appris à paginer et à trier les résultats de nos requêtes dans Spring Data JPA.

Comme toujours, les exemples de code complets utilisés dans ce didacticiel sont disponiblesover on Github.