Paginierung und Sortierung mit Spring Data JPA

1. Übersicht

Die Paginierung ist oft hilfreich, wenn wir einen großen Datensatz haben und ihn dem Benutzer in kleineren Blöcken präsentieren möchten.

Außerdem müssen wir diese Daten beim Paging häufig nach bestimmten Kriterien sortieren.

In diesem Tutorial erfahren Sie, wie Sie mit Spring Data JPA einfach paginieren und sortieren können.

2. Ersteinrichtung

Angenommen, wir haben eine Produktentität als Domänenklasse:

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

Jede unserer Produktinstanzen hat eine eindeutige Kennung: ID , Name und Preis .

3. Erstellen eines Repositorys

Für den Zugriff auf unsere Produkte benötigen wir ein ProductRepository :

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

Durch die Erweiterung von PagingAndSortingRepository erhalten wir die Methoden findAll (Pageable pageable) und findAll (Sort sort) zum Paging und Sortieren.

Umgekehrt hätten wir stattdessen JpaRepository erweitern können , da es auch PagingAndSortingRepository erweitert .

Sobald wir PagingAndSortingRepository erweitern , können wir unsere eigenen Methoden hinzufügen, die Pageable und Sort als Parameter verwenden , wie wir es hier mit findAllByPrice getan haben .

Lassen Sie uns einen Blick darauf werfen, wie wir unsere Produkte mit unserer neuen Methode paginieren können .

4. Paginierung

Sobald sich unser Repository von PagingAndSortingRepository erstreckt , müssen wir nur noch:

  1. Erstellen oder erhalten Sie ein PageRequest- Objekt, bei dem es sich um eine Implementierung der Pageable- Schnittstelle handelt
  2. Übergeben Sie das PageRequest- Objekt als Argument an die Repository-Methode, die wir verwenden möchten

Wir können ein PageRequest- Objekt erstellen, indem wir die angeforderte Seitenzahl und die Seitengröße übergeben.

Hier beginnt die Seitenzahl bei Null:

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

In Spring MVC können wir auch die Pageable- Instanz in unserem Controller mithilfe des Spring Data Web Support abrufen .

Sobald wir unser PageRequest- Objekt haben, können wir es übergeben, während wir die Methode unseres Repositorys aufrufen:

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

Die Methode findAll (Pageable pageable) gibt standardmäßig ein Page- Objekt zurück.

Allerdings können wir entweder eine Rückkehr wählen Seite, eine Scheibe, oder eine Liste von jedem unserer benutzerdefinierten Methoden Rückkehr paginierte Daten .

Eine Seiteninstanz kennt nicht nur die Liste der Produkte , sondern auch die Gesamtzahl der verfügbaren Seiten. Es löst eine zusätzliche Zählabfrage aus, um dies zu erreichen. Um solche Gemeinkosten zu vermeiden, können wir stattdessen ein Slice oder eine Liste zurückgeben .

Ein Slice weiß nur, ob das nächste Slice verfügbar ist oder nicht.

5. Paginierung und Sortierung

Um nur unsere Abfrageergebnisse zu sortieren, können wir einfach eine Instanz von Sort an die Methode übergeben:

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

Was ist jedoch, wenn wir unsere Daten sowohl sortieren als auch seiten möchten ?

Wir können dies tun, indem wir die Sortierdetails an unser PageRequest- Objekt selbst übergeben:

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

Basierend auf unseren Sortieranforderungen können wir die Sortierfelder und die Sortierrichtung beim Erstellen unserer PageRequest- Instanz angeben .

Wie üblich können wir diese Instanz vom Typ Pageable dann an die Methode des Repositorys übergeben.

6. Fazit

In diesem Artikel haben wir gelernt, wie Sie unsere Abfrageergebnisse in Spring Data JPA paginieren und sortieren.

Wie immer sind die vollständigen Codebeispiele in diesem Artikel auf Github verfügbar.