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を使用してこのクエリを作成できますか?
このメソッド名は、トリックを行う必要があります:
Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
詳細については、リファレンスドキュメントの query derivation に関するセクションを参照してください。
上記-findByBookIdRegion()が機能しませんでした。以下は、最新リリースのString Data JPAで機能します。
Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);
組み合わせたプライマリキーとして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;
...
私によると、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);