CrudRepository, JpaRepository et PagingAndSortingRepository dans Spring Data

1. Vue d'ensemble

Dans cet article rapide, nous nous concentrerons sur différents types d'interfaces de référentiel Spring Data et leurs fonctionnalités. Nous aborderons:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

En termes simples, chaque référentiel de Spring Data étend l' interface générique du référentiel , mais au-delà de cela, ils ont chacun des fonctionnalités différentes.

2. Référentiels de données Spring

Commençons par le JpaRepository - qui étend PagingAndSortingRepository et, à son tour, le CrudRepository .

Chacun de ces éléments définit sa propre fonctionnalité:

  • CrudRepository fournit des fonctions CRUD
  • PagingAndSortingRepository fournit des méthodes pour paginer et trier les enregistrements
  • JpaRepository fournit des méthodes liées à JPA telles que le vidage du contexte de persistance et la suppression des enregistrements dans un lot

Et donc, en raison de cette relation d'héritage, le JpaRepository contient l'API complète de CrudRepository et PagingAndSortingRepository .

Lorsque nous n'avons pas besoin de toutes les fonctionnalités fournies par JpaRepository et PagingAndSortingRepository , nous pouvons simplement utiliser le CrudRepository .

Jetons maintenant un coup d'œil à un exemple rapide pour mieux comprendre ces API.

Nous allons commencer par une simple entité Product :

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

Et implémentons une opération simple - trouvez un produit en fonction de son nom:

@Repository public interface ProductRepository extends JpaRepository { Product findByName(String productName); }

C'est tout. Le référentiel de données Spring générera automatiquement l'implémentation en fonction du nom que nous lui avons fourni.

C'était un exemple très simple bien sûr; vous pouvez aller plus loin dans Spring Data JPA ici.

3. CrudRepository

Jetons maintenant un coup d'œil au code de l' interface CrudRepository :

public interface CrudRepository extends Repository {  S save(S entity); T findOne(ID primaryKey); Iterable findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }

Notez la fonctionnalité CRUD typique:

  • save (…) - s ave un Iterable d'entités. Ici, nous pouvons passer plusieurs objets pour les enregistrer dans un lot
  • findOne (…) - obtenir une seule entité en fonction de la valeur de clé primaire transmise
  • findAll () - obtenir un Iterable de toutes les entités disponibles dans la base de données
  • count () - renvoie le nombre total d'entités dans une table
  • delete (…) - supprime une entité en fonction de l'objet passé
  • existe (…) - vérifier si une entité existe en fonction de la valeur de clé primaire transmise

Cette interface semble assez générique et simple, mais en fait, elle fournit toutes les abstractions de requête de base nécessaires dans une application.

4. PagingAndSortingRepository

Voyons maintenant une autre interface de référentiel, qui étend CrudRepository :

public interface PagingAndSortingRepository extends CrudRepository { Iterable findAll(Sort sort); Page findAll(Pageable pageable); }

Cette interface fournit une méthode findAll (Pageable pageable) , qui est la clé de l'implémentation de Pagination.

Lors de l'utilisation de Pageable , nous créons un objet Pageable avec certaines propriétés et nous devons spécifier au moins:

  1. Taille de la page
  2. Numéro de la page actuelle
  3. Tri

Supposons donc que nous souhaitons afficher la première page d'un jeu de résultats trié par lastName, croissant, ne contenant pas plus de cinq enregistrements chacun. Voici comment nous pouvons y parvenir en utilisant une PageRequest et une définition de tri :

Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName")); Pageable pageable = new PageRequest(0, 5, sort);

La transmission de l'objet paginable à la requête de données Spring renverra les résultats en question (le premier paramètre de PageRequest est basé sur zéro).

5. JpaRepository

Enfin, nous allons jeter un œil à l' interface JpaRepository :

public interface JpaRepository extends PagingAndSortingRepository { List findAll(); List findAll(Sort sort); List save(Iterable entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable entities); }

Encore une fois, regardons chacune de ces méthodes en bref:

  • findAll () - obtenir une liste de toutes les entités disponibles dans la base de données
  • findAll (…) - obtenir une liste de toutes les entités disponibles et les trier en utilisant la condition fournie
  • save (…) - s ave un Iterable d'entités. Ici, nous pouvons passer plusieurs objets pour les enregistrer dans un lot
  • flush () - affiche toutes les tâches en attente dans la base de données
  • saveAndFlush (…) - enregistre l'entité et vide immédiatement les modifications
  • deleteInBatch (…) - supprime un Iterable d'entités. Ici, nous pouvons passer plusieurs objets pour les supprimer dans un lot

De toute évidence, l'interface ci-dessus étend PagingAndSortingRepository, ce qui signifie qu'elle a également toutes les méthodes présentes dans CrudRepository .

6. Inconvénients des référentiels de données Spring

Beyond all the very useful advantages of these repositories, there are some basic downsides of directly depending on these as well:

  1. we couple our code to the library and to its specific abstractions, such as `Page` or `Pageable`; that's of course not unique to this library – but we do have to be careful not to expose these internal implementation details
  2. by extending e.g. CrudRepository, we expose a complete set of persistence method at once. This is probably fine in most circumstances as well but we might run into situations where we'd like to gain more fine-grained control over the methods exposed, e.g. to create a ReadOnlyRepository that doesn't include the save(…) and delete(…) methods of CrudRepository

7. Conclusion

Cet article a couvert quelques différences et fonctionnalités brèves mais importantes des interfaces de référentiel Spring Data JPA.

Pour plus d'informations, jetez un œil à la série sur Spring Persistence.