1. 概要

このチュートリアルでは、@EmbeddedIdアノテーションと「findBy」メソッドを使用して複合キーベースのJPAエンティティをクエリする方法について説明します。

したがって、は@EmbeddeIdおよび@Embeddableアノテーションを使用して、JPAエンティティの複合キーを表します。 また、目標を達成するには、Spring JpaRepositoryを使用する必要があります。

部分的な主キーによるオブジェクトのクエリに集中します。

2. @Embeddableおよび@EmbeddedIdの必要性

ソフトウェアでは、テーブルのエントリを定義するために複合主キーが必要な場合に、多くのユースケースに遭遇します。 複合主キーは、複数の列を使用してテーブル内の行を一意に識別するキーです

クラスで@Embeddableアノテーションを使用して、SpringDataで複合主キーを表します。 次に、このキーは、@Embeddableタイプのフィールドで@EmbeddedIdアノテーションを使用して、複合主キーとしてテーブルの対応するエンティティクラスに埋め込まれます。

3. 例

book テーブルについて考えてみます。ここで、 book レコードには、authornameで構成される複合主キーがあります。 主キーの一部でを検索したい場合があります。 たとえば、ユーザーが特定の著者だけが本を検索したい場合があります。 JPAを使用してこれを行う方法を学習します。

主なアプリケーションは、 @EmbeddableBookId@EntityBook@EmbeddedIdBookId。で構成されます。

3.1. @Embeddable

このセクションでBookIdクラスを定義しましょう。 authornameは、一意の BookId を指定します—クラスは Serializable であり、equalsとの両方を実装しますX153X] hashCode メソッド:

@Embeddable
public class BookId implements Serializable {

    private String author;
    private String name;

    // standard getters and setters
}

3.2. @Entityおよび@EmbeddedId

Book エンティティには、 @EmbeddedId BookIdおよびbookに関連するその他のフィールドがあります。 BookId は、Bookエンティティに複合キーがあることをJPAに通知します。

@Entity
public class Book {

    @EmbeddedId
    private BookId id;
    private String genre;
    private Integer price;

    //standard getters and setters
}

3.3. JPAリポジトリとメソッドの命名

JpaRepositoryをエンティティBookおよびBookIdで拡張して、JPAリポジトリー・インターフェースをすばやく定義しましょう。

@Repository
public interface BookRepository extends JpaRepository<Book, BookId> {

    List<Book> findByIdName(String name);

    List<Book> findByIdAuthor(String author);
}

id 変数のフィールド名の一部を使用して、SpringDataクエリメソッドを派生させます。 したがって、JPAは部分的な主キークエリを次のように解釈します。

findByIdName -> directive "findBy" field "id.name"
findByIdAuthor -> directive "findBy" field "id.author"

4. 結論

JPAを使用すると、複合キーを効率的にマッピングし、派生クエリを介してそれらをクエリできます。

この記事では、部分IDフィールド検索を実行する小さな例を見ました。 複合主キーを表す@Embeddableアノテーションと、エンティティに複合キーを挿入する@EmbeddedIdアノテーションを確認しました。

最後に、JpaRepository findBy 派生メソッドを使用して、部分IDフィールドで検索する方法を確認しました。

いつものように、このチュートリアルのサンプルコードは、GitHubからで入手できます。