Spring DataのCrudRepository、JpaRepository、およびPagingAndSortingRepository
データ]
-
リンク:/tag/jpa/[JPA]
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機能を提供します
**
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
オブジェクトを作成し、少なくとも次のものを指定します。
-
ページサイズ
-
現在のページ番号
-
ソート
そのため、結果セットの最初のページを
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データリポジトリの欠点
これらのリポジトリのすべての非常に便利な利点に加えて、これらに直接依存することの基本的な欠点もいくつかあります。
-
コードをライブラリとその特定の抽象化に結合します.
Page`や
Pageable`など。これはもちろんこれだけのものではありません
図書館 – しかし私達はこれらの内部を露出しないように気を付けなければ
実装の詳細
。拡張することによって。
CrudRepository
、の完全なセットを公開します
永続化メソッドこれはたいていの状況でもおそらく大丈夫ですが、公開されたメソッドをもっときめ細かく制御したい状況に遭遇するかもしれません。
CrudRepository
の
save(…)
および
delete(…)
メソッドを含まない
ReadOnlyRepository
を作成する
7. 結論
この記事では、Spring Data JPAリポジトリインタフェースのいくつかの簡単で重要な相違点と機能について説明しました。
詳細については、リンク上のシリーズ//persistence-with-spring-series/[Spring Persistence]を参照してください。