SpringデータのCrudRepository、JPaRepository、およびPagingAndSortingRepository
1. 概要
この簡単な記事では、さまざまな種類のSpringDataリポジトリーインターフェースとその機能に焦点を当てます。 触れます:
-
CrudRepository
-
PagingAndSortingRep Repository
-
JpaRepository
簡単に言えば、Spring Dataのすべてのリポジトリは、汎用のRepositoryインターフェースを拡張しますが、それを超えて、それぞれが異なる機能を持っています。
2. Springデータリポジトリ
Let’s start with the JpaRepository –これはPagingAndSortingRepositoryを拡張し、次にCrudRepositoryを拡張します。
これらはそれぞれ独自の機能を定義します。
-
CrudRepositoryはCRUD関数を提供します
-
PagingAndSortingRepositoryは、ページ付けを行い、レコードを並べ替えるメソッドを提供します
-
JpaRepositoryは、永続コンテキストのフラッシュやバッチでのレコードの削除など、JPA関連のメソッドを提供します
したがって、この継承関係のために、JpaRepository contains the full API of CrudRepository and PagingAndSortingRepository.
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 findByName(String productName);
}
それで全部です。 Spring Data Repositoryは、指定された名前に基づいて実装を自動生成します。
もちろん、これは非常に単純な例でした。 Spring Data JPAhereをさらに深く掘り下げることができます。
3. CrudRepository
次に、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);
}
典型的なCRUD機能に注意してください。
-
save(…) – sエンティティのIterableを保存します。 ここでは、複数のオブジェクトを渡してそれらをバッチで保存できます
-
findOne(…) –渡された主キー値に基づいて単一のエンティティを取得します
-
findAll() –データベースで使用可能なすべてのエンティティのIterableを取得します
-
count() – rテーブル内のエンティティの総数を変換します
-
delete(…) –渡されたオブジェクトに基づいてエンティティを削除します
-
exists(…)–渡された主キー値に基づいてエンティティが存在するかどうかを確認します
このインターフェイスは非常に汎用的でシンプルに見えますが、実際には、アプリケーションで必要なすべての基本的なクエリ抽象化を提供します。
4. PagingAndSortingRepository
それでは、CrudRepositoryを拡張する別のリポジトリインターフェースを見てみましょう。
public interface PagingAndSortingRepository
extends CrudRepository {
Iterable findAll(Sort sort);
Page findAll(Pageable pageable);
}
このインターフェースは、Pagination.を実装するための鍵となるメソッドfindAll(Pageable pageable)を提供します。
Pageableを使用する場合、特定のプロパティを持つPageableオブジェクトを作成し、少なくとも次のように指定する必要があります。
-
ページサイズ
-
現在のページ番号
-
ソート
したがって、結果セットの最初のページをlastName,の昇順で並べ替えて、それぞれ5つ以下のレコードで表示するとします。 これは、PageRequestとSortの定義を使用してこれを実現する方法です。
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 extends
PagingAndSortingRepository {
List findAll();
List findAll(Sort sort);
List save(Iterable extends T> entities);
void flush();
T saveAndFlush(T entity);
void deleteInBatch(Iterable entities);
}
繰り返しになりますが、これらの各方法を簡単に見てみましょう。
-
findAll() –データベースで使用可能なすべてのエンティティのListを取得します
-
findAll(…) –使用可能なすべてのエンティティのListを取得し、指定された条件を使用してそれらを並べ替えます
-
save(…) – sエンティティのIterableを保存します。 ここでは、複数のオブジェクトを渡してそれらをバッチで保存できます
-
flush() – f保留中のすべてのタスクをデータベースにスラッシュします
-
saveAndFlush(…) –エンティティを保存し、変更をすぐにフラッシュします
-
deleteInBatch(…)–エンティティのIterableを削除します。 ここでは、複数のオブジェクトを渡してバッチで削除できます
明らかに、上記のインターフェースはPagingAndSortingRepositoryを拡張します。これは、CrudRepositoryにもすべてのメソッドが存在することを意味します。
6. Springデータリポジトリの欠点
これらのリポジトリのすべての非常に有用な利点に加えて、これらに直接依存するいくつかの基本的な欠点もあります。
-
コードをライブラリと、
Page
やPageable
などの特定の抽象化に結合します。もちろん、これはこのライブラリに固有のものではありませんが、これらの内部実装の詳細を公開しないように注意する必要があります。 -
例えば CrudRepository、永続化メソッドの完全なセットを一度に公開します。 これはほとんどの状況でもおそらく問題ありませんが、公開されているメソッドをよりきめ細かく制御したい状況に遭遇する可能性があります。 CrudRepositoryのsave(…)およびdelete(…)メソッドを含まないReadOnlyRepositoryを作成するには
7. 結論
この記事では、Spring Data JPAリポジトリインターフェースのいくつかの簡単で重要な違いと機能について説明しました。
詳細については、Spring Persistenceのシリーズをご覧ください。