最終更新日:2020/03/19 原本

Spring DataのCrudRepository、JpaRepository、およびPagingAndSortingRepository

1概要

このクイック記事では、さまざまな種類のSpring Dataリポジトリインターフェイスとその機能に焦点を当てます。次に触れます。

  • CrudRepository

  • PagingAndSortingRepository

  • JpaRepository

簡単に言うと、http://projects.spring.io/spring-data/[Spring Data]内のすべてのリポジトリは一般的な Repository インターフェースを拡張しますが、それを超えるとそれぞれが異なる機能を持ちます。

2 Springデータリポジトリ

httpを拡張した http://static.springsource.org/spring-data/data-jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html[JpaRepository] から始めましょう。//static.springsource.org/spring-data/data-commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html 、そしてまた http://static.springsource .org/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html[CrudRepository]​​__。

これらはそれぞれ独自の機能を定義します。

CRUD機能(Create,Read,Updat,Delete)を提供します ** PagingAndSortingRepository ​​

ページネーションを行い、レコードをソートするためのメソッドを提供します。 ** JpaRepository ​​

永続コンテキストのフラッシュやレコードの一括削除など、JPA関連のメソッドを提供します。

そのため、この継承関係のため、** JpaRepository には CrudRepository および PagingAndSortingRepository の完全なAPIが含まれています。

JpaRepository および PagingAndSortingRepository が提供する全機能を必要としない場合は、単に CrudRepository を使用できます。

これらのAPIをよりよく理解するための簡単な例を見てみましょう。

単純な Product エンティティから始めましょう。

@Entity
public class Product {

    @Id
    private long id;
    private String name;

   //getters and setters
}

そして、簡単な操作を実装しましょう - 名前に基づいて Product を見つけます。

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

それで全部です。 Spring Data Repositoryは、提供された名前に基づいて実装を自動生成します。

これはもちろん非常に単純な例です。 Spring Data JPAリンク:/永続層 - 春データjpa[ここ]にもっと深く入ることができます。

3 CrudRepository

それでは、http://static.springsource.org/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html[ CrudRepository ]インターフェースのコードを見てみましょう。

public interface CrudRepository<T, ID extends Serializable>
  extends Repository<T, ID> {

    <S extends T> S save(S entity);

    T findOne(ID primaryKey);

    Iterable<T> findAll();

    Long count();

    void delete(T entity);

    boolean exists(ID primaryKey);
}

典型的なCRUD機能に注意してください。

  • __save(…​) - エンティティの Iterable__を保存します。ここで、私たちは渡すことができます

複数のオブジェクトをまとめて保存する ** findOne(…​) - 渡された主キー値に基づいて単一のエンティティを取得する

  • findAll() - データベースで利用可能なすべてのエンティティの Iterable を取得します

  • ____count() - テーブル内の総エンティティ数のカウント

  • delete(…​) - 渡されたオブジェクトに基づいてエンティティを削除します

  • exists(…​) - 渡された主キーに基づいてエンティティが存在するかどうかを確認します

このインターフェースは非常に一般的で単純に見えますが、実際には、アプリケーションに必要なすべての基本的な照会抽象化を提供します。

4 PagingAndSortingRepository

それでは、 CrudRepository を拡張する別のリポジトリインタフェースを見てみましょう。

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}

このインタフェースは、 Pagination. を実装するための鍵となるメソッド findAll(Pageable pageable) を提供します。

Pageable を使用するときは、特定のプロパティを持つ Pageable オブジェクトを作成し、少なくとも次のものを指定します。

  1. ページサイズ

  2. 現在のページ番号

  3. ソート

そのため、結果セットの最初のページを lastName、 ascendingでソートして表示し、それぞれのレコード数が5つ以下であるとします。

これは、 PageRequest および Sort 定義を使用してこれを実現する方法です。

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

ページング可能オブジェクトをSpringデータクエリに渡すと、問題の結果が返されます( PageRequest の最初のパラメータは0から始まります)。

5 JpaRepository

最後に、http://static.springsource.org/spring-data/data-jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html[ JpaRepository ]を見てみましょう。インタフェース:

public interface JpaRepository<T, ID extends Serializable> extends
  PagingAndSortingRepository<T, ID> {

    List<T> findAll();

    List<T> findAll(Sort sort);

    List<T> save(Iterable<? extends T> entities);

    void flush();

    T saveAndFlush(T entity);

    void deleteInBatch(Iterable<T> entities);
}

繰り返しますが、これらの各方法について簡単に説明しましょう。

  • findAll() - データベースで利用可能なすべてのエンティティの List を取得します

  • findAll(…​) - 利用可能なすべてのエンティティの List を取得し、それらをソートします

与えられた条件を使う ** __save(…​) - エンティティの Iterable__を保存します。ここで、私たちは渡すことができます

複数のオブジェクトをまとめて保存する ** __flush() - すべての保留タスクをデータベースにf __lush

  • saveAndFlush(…​) - エンティティを保存して変更を即座にフラッシュします

  • deleteInBatch(…​) - エンティティの Iterable を削除します。ここで、私たちは渡すことができます

複数のオブジェクトをまとめて削除する

明らかに、上記のインターフェースは PagingAndSortingRepository を拡張しています。これは CrudRepository にもすべてのメソッドが存在することを意味します。

6. Springデータリポジトリの欠点

これらのリポジトリのすべての非常に便利な利点に加えて、これらに直接依存することの基本的な欠点もいくつかあります。

  1. コードをライブラリとその特定の抽象化に結合します.

Page`や Pageable`など。これはもちろんこれだけのものではありません 図書館 - しかし私達はこれらの内部を露出しないように気を付けなければ 実装の詳細 。拡張することによって。 CrudRepository 、の完全なセットを公開します

永続化メソッドこれはたいていの状況でもおそらく大丈夫ですが、公開されたメソッドをもっときめ細かく制御したい状況に遭遇するかもしれません。 CrudRepository save(…​) および delete(…​) メソッドを含まない ReadOnlyRepository を作成する

7. 結論

この記事では、Spring Data JPAリポジトリインタフェースのいくつかの簡単で重要な相違点と機能について説明しました。

詳細については、リンク上のシリーズ//persistence-with-spring-series/[Spring Persistence]を参照してください。