web-dev-qa-db-ja.com

埋め込みオブジェクトプロパティによるSpring Data JPAの検索

Spring Data JPAリポジトリインターフェイスメソッドシグネチャを記述して、そのエンティティに埋め込まれたオブジェクトのプロパティを持つエンティティを検索できるようにします。これが可能かどうか、誰がどのようにできるか知っていますか?

ここに私のコードがあります:

@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
        "bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {

    @Embedded
    @NotNull
    private BookId bookId;

    ...

}

@Embeddable
public class BookId implements Serializable {

    @NotNull
    @Size(min=1, max=40)
    private String bookId;

    @NotNull
    @Enumerated(EnumType.STRING)
    private Region region;

    ...

}

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

    //I'd like to write a method like this, but can't figure out how to search by region,
    //when region is actually a part of the embedded BookId
    Page<QueuedBook> findByRegion(Region region, Pageable pageable);

}

Spring Dataを使用してこのクエリを作成できますか?

89
CorayThan

このメソッド名は、トリックを行う必要があります:

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);

詳細については、リファレンスドキュメントの query derivation に関するセクションを参照してください。

128
Oliver Drotbohm

上記-findByBookIdRegion()が機能しませんでした。以下は、最新リリースのString Data JPAで機能します。

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);
38
Bazinga

組み合わせたプライマリキーとしてBookIdを使用している場合、インターフェイスを次のように変更することを忘れないでください。

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

に:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

そして、QueuedBookクラスでアノテーション@Embeddedを@EmbeddedIdに変更します。

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...
8
Tim Kara

私によると、Springはすべてのケースを簡単に処理できるわけではありません。あなたの場合、次のトリックを行う必要があります

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);  

または

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

ただし、@Embeddableクラスにあるフィールドの命名規則にも依存します。

例えば次のフィールドは、上記のどのスタイルでも機能しない可能性があります

private String cRcdDel;

私は両方のケースで(次のように)試してみましたが、うまくいきませんでした(Springはこのタイプの命名規則を処理していないようです(つまり、多くのCaps、特に最初から2文字目(これが唯一のケース)

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable); 

または

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);

列の名前を

private String rcdDel;

私の次のソリューションは問題なく正常に動作します:

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable); 

OR

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);
0
Bhavik