Paginacja i sortowanie za pomocą Spring Data JPA

1. Przegląd

Paginacja jest często pomocna, gdy mamy duży zbiór danych i chcemy przedstawić go użytkownikowi w mniejszych fragmentach.

Ponadto często musimy sortować te dane według pewnych kryteriów podczas stronicowania.

W tym samouczku nauczymy się, jak łatwo dzielić na strony i sortować za pomocą Spring Data JPA.

2. Konfiguracja wstępna

Po pierwsze, powiedzmy, że naszą klasą domeny jest jednostka Product :

@Entity public class Product { @Id private long id; private String name; private double price; // constructors, getters and setters }

Każda z naszych instancji Produktu ma unikalny identyfikator: identyfikator , jego nazwę i powiązaną z nim cenę .

3. Tworzenie repozytorium

Aby uzyskać dostęp do naszych produktów , będziemy potrzebować ProductRepository :

public interface ProductRepository extends PagingAndSortingRepository { List findAllByPrice(double price, Pageable pageable); }

Rozszerzając PagingAndSortingRepository , otrzymujemy metody findAll (Pageable pageable) i findAll (sortowanie sortowania) do stronicowania i sortowania.

I odwrotnie, mogliśmy zamiast tego zdecydować się na rozszerzenie JpaRepository , ponieważ rozszerza ono również PagingAndSortingRepository .

Kiedy przedłużyć PagingAndSortingRepository , możemy dodać nasze własne metody, które mają stronicowalnej i Sort jako parametry , jak my tu z findAllByPrice .

Rzućmy okiem na jak paginate nasz produkt s stosując naszą nową metodę.

4. Paginacja

Po rozszerzeniu naszego repozytorium z PagingAndSortingRepository , musimy tylko:

  1. Utwórz lub uzyskaj obiekt PageRequest , który jest implementacją interfejsu Pageable
  2. Przekaż obiekt PageRequest jako argument do metody repozytorium, której zamierzamy użyć

Możemy utworzyć obiekt PageRequest , przekazując żądany numer strony i rozmiar strony.

Tutaj liczba stron zaczyna się od zera:

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

W Spring MVC możemy również zdecydować się na uzyskanie instancji Pageable w naszym kontrolerze za pomocą Spring Data Web Support.

Gdy już mamy nasz obiekt PageRequest , możemy go przekazać podczas wywoływania metody naszego repozytorium:

Page allProducts = productRepository.findAll(firstPageWithTwoElements); List allTenDollarProducts = productRepository.findAllByPrice(10, secondPageWithFiveElements);

Metoda findAll (Pageable pageable) domyślnie zwraca obiekt Page .

Jednakże, możemy zdecydować się na powrót albo strona, na plaster, lub listy z każdym z naszych metod niestandardowych przekazujących dane z numeracją stron .

Page instancji, oprócz posiadania listę produktów s, wie również o ogólnej liczbie dostępnych stron. Aby to osiągnąć, wyzwala dodatkowe zapytanie zliczające. Aby uniknąć takich kosztów ogólnych, możemy zamiast tego zwrócić Wycinek lub Listę .

Kawałek tylko wie, czy następny kawałek jest dostępny czy nie.

5. Paginacja i sortowanie

Podobnie, aby po prostu posortować wyniki naszych zapytań, możemy po prostu przekazać wystąpienie Sort do metody:

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

A co, jeśli chcemy zarówno sortować, jak i stronicować nasze dane?

Możemy to zrobić, przekazując szczegóły sortowania do samego obiektu PageRequest :

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")));

Na podstawie naszych wymagań dotyczących sortowania możemy określić pola sortowania i kierunek sortowania podczas tworzenia naszej instancji PageRequest .

Jak zwykle możemy następnie przekazać tę instancję typu Pageable do metody repozytorium.

6. Wniosek

W tym artykule dowiedzieliśmy się, jak podzielić na strony i sortować wyniki zapytań w Spring Data JPA.

Jak zawsze, pełne przykłady kodu użyte w tym artykule są dostępne na Github.