1. 概要

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

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

簡単に言えば、 Spring Data のすべてのリポジトリは、汎用の Repository インターフェイスを拡張しますが、それを超えると、それぞれに異なる機能があります。

2. Springデータリポジトリ

JpaRepository から始めましょう。これは、 PagingAndSortingRepository を拡張し、次にCrudRepositoryを拡張します。

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

  • CrudRepositoryはCRUD関数を提供します
  • 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 DataJPAここをさらに深く掘り下げることができます。

3. CrudRepository

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(…)–sエンティティのIterableを保存します。 ここでは、複数のオブジェクトを渡してバッチで保存できます
  • findOne(…) –渡された主キー値に基づいて単一のエンティティを取得します
  • findAll() –データベースで使用可能なすべてのエンティティのIterableを取得します
  • count()–rテーブル内のエンティティの総数を返します
  • delete(…) –渡されたオブジェクトに基づいてエンティティを削除します
  • presents(…)–渡された主キー値に基づいてエンティティが存在するかどうかを確認します

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

4. PagingAndSortingRepository

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

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

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}

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

Pageable を使用する場合、特定のプロパティを持つ Pageable オブジェクトを作成し、少なくとも次のように指定する必要があります。

  1. ページサイズ
  2. 現在のページ番号
  3. 並べ替え

したがって、結果セットの最初のページを lastName、の昇順で並べ替えて、それぞれ5つ以下のレコードで表示するとします。 これは、PageRequestSortの定義を使用してこれを実現する方法です。

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

ページング可能なオブジェクトをSpringデータクエリに渡すと、問題の結果が返されます( PageRequest の最初のパラメーターはゼロベースです)。

5. JpaRepository

最後に、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() –データベースで使用可能なすべてのエンティティのリストを取得します
  • findAll(…) –使用可能なすべてのエンティティのリストを取得し、提供された条件を使用してそれらを並べ替えます
  • save(…)–sエンティティのIterableを保存します。 ここでは、複数のオブジェクトを渡してバッチで保存できます
  • flush()–f保留中のすべてのタスクをデータベースにフラッシュします
  • saveAndFlush(…) –エンティティを保存し、変更をすぐにフラッシュします
  • deleteInBatch(…)–エンティティのIterableを削除します。 ここでは、複数のオブジェクトを渡して、それらをバッチで削除できます

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

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

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

  1. コードをライブラリと、`Page`や`Pageable`などの特定の抽象化に結合します。 もちろん、これはこのライブラリに固有のものではありませんが、これらの内部実装の詳細を公開しないように注意する必要があります。
  2. 例えば拡張することによって CrudRepository 、永続化メソッドの完全なセットを一度に公開します。 これはほとんどの状況でもおそらく問題ありませんが、公開されているメソッドをよりきめ細かく制御したい状況に遭遇する可能性があります。 CrudRepositorysave(…)および delete(…)メソッドを含まないReadOnlyRepositoryを作成します。

7. 結論

この記事では、Spring DataJPAリポジトリー・インターフェースのいくつかの短いが重要な違いと機能について説明しました。

詳細については、 SpringPersistenceのシリーズをご覧ください。