データ]

  • リンク:/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

オブジェクトを作成し、少なくとも次のものを指定します。

  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]を参照してください。