CrudRepository, JpaRepository et PagingAndSortingRepository dans les données de printemps

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 deSpring Data étend l'interface générique deRepository, mais au-delà de cela, ils ont chacun des fonctionnalités différentes.

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

Let’s start with the JpaRepository - qui étendPagingAndSortingRepository et, à son tour, lesCrudRepository.

Chacun de ces 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 d'enregistrements dans un lot

Et donc, à cause de cette relation d'héritage, lesJpaRepository contains the full API of CrudRepository and PagingAndSortingRepository.

Lorsque nous n’avons pas besoin de toutes les fonctionnalités fournies parJpaRepository etPagingAndSortingRepository, nous pouvons simplement utiliser lesCrudRepository.

Voyons maintenant 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 - recherchez unProduct 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 JPAhere.

3. CrudRepository

Voyons maintenant le code de l’interfaceCrudRepository:

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é typique de CRUD:

  • save(…) – sauvegarde unIterable d'entités. Ici, nous pouvons passer plusieurs objets pour les sauvegarder dans un lot

  • findOne(…) - obtenir une seule entité en fonction de la valeur de clé primaire transmise

  • findAll() - obtient unIterable de toutes les entités disponibles dans la base de données

  • count() – rdéfinit le nombre d'entités totales dans une table

  • delete(…) - supprime une entité en fonction de l'objet passé

  • existe (…) - vérifie si une entité existe en fonction de la valeur de clé primaire transmise

Cette interface semble assez générique et simple, mais en réalité, elle fournit toutes les abstractions de base des requêtes nécessaires à une application.

4. PagingAndSortingRepository

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

public interface PagingAndSortingRepository
  extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}

Cette interface fournit une méthodefindAll(Pageable pageable), qui est la clé pour implémenterPagination.

Lorsque vous utilisezPageable, nous créons un objetPageable avec certaines propriétés et nous devons spécifier au moins:

  1. Taille de la page

  2. Numéro de page actuel

  3. Tri

Supposons donc que nous souhaitons afficher la première page d’un ensemble de résultats triés parlastName, croissant, ne contenant pas plus de cinq enregistrements chacun. Voici comment nous pouvons y parvenir en utilisant une définitionPageRequest etSort:

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 retournera les résultats en question (le premier paramètre dePageRequest est basé sur zéro).

5. JpaRepository

Enfin, nous allons jeter un œil à l’interface deJpaRepository:

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, examinons brièvement chacune de ces méthodes:

  • findAll() - obtenir unList de toutes les entités disponibles dans la base de données

  • findAll(…) - obtenir unList de toutes les entités disponibles et les trier en utilisant la condition fournie

  • save(…) – sauvegarde unIterable d'entités. Ici, nous pouvons passer plusieurs objets pour les sauvegarder dans un lot

  • flush() – fajoute toutes les tâches en attente à la base de données

  • saveAndFlush(…) - enregistre l'entité et vide immédiatement les modifications

  • deleteInBatch (…) - supprime unIterable d'entités. Ici, nous pouvons passer plusieurs objets pour les supprimer dans un lot

Clairement, l'interface ci-dessus étendPagingAndSortingRepository, ce qui signifie que toutes les méthodes sont également présentes dans lesCrudRepository.

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

Au-delà de tous les avantages très utiles de ces référentiels, il existe quelques inconvénients de base qui dépendent directement de ceux-ci:

  1. nous couplons notre code à la bibliothèque et à ses abstractions spécifiques, telles quePage ouPageable; ce n'est bien sûr pas unique à cette bibliothèque - mais nous devons faire attention à ne pas exposer ces détails de mise en œuvre interne

  2. en étendant par exemple CrudRepository, nous exposons un ensemble complet de méthodes de persistance à la fois. C'est probablement aussi bien dans la plupart des cas, mais nous pourrions nous retrouver dans des situations où nous aimerions avoir un contrôle plus fin sur les méthodes exposées, par exemple pour créer unReadOnlyRepository qui n'inclut pas les méthodessave(…) etdelete(…) deCrudRepository

7. Conclusion

Cet article couvre quelques différences et caractéristiques brèves mais importantes des interfaces de référentiel Spring Data JPA.

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