Saya ingin menulis tanda tangan metode antarmuka repositori JPA Spring Data yang memungkinkan saya menemukan entitas dengan properti objek yang disematkan dalam entitas itu. Adakah yang tahu apakah ini mungkin, dan jika demikian bagaimana?
Ini kode saya:
@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);
}
Dapatkah saya menulis kueri untuk ini menggunakan Spring Data?
java
spring
jpa
spring-data
spring-data-jpa
CorayThan
sumber
sumber
findByBookIdRegion(Region region, Pageable pageable)
berhasil?Jawaban:
Nama metode ini harus melakukan trik:
Info lebih lanjut tentang itu di bagian tentang derivasi kueri dari dokumen referensi.
sumber
One findByIdAndTwoId(Long oneId, Long twoId);
dan menghasilkan query dalam bentuk:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
Di atas - findByBookIdRegion () tidak berhasil untuk saya. Yang berikut berfungsi dengan rilis terbaru dari String Data JPA:
sumber
Jika Anda menggunakan BookId sebagai kunci utama gabungan, ingatlah untuk mengubah antarmuka Anda dari:
untuk:
Dan ubah anotasi @Embedded menjadi @EmbeddedId, di kelas QueuedBook Anda seperti ini:
sumber
Menurut saya, Spring tidak menangani semua kasus dengan mudah. Dalam kasus Anda, berikut ini harus dilakukan
atau
Namun, itu juga tergantung pada konvensi penamaan bidang yang Anda miliki di
@Embeddable
kelas Anda ,mis. bidang berikut mungkin tidak berfungsi dalam salah satu gaya yang disebutkan di atas
Saya mencoba dengan kedua kasus (sebagai berikut) dan tidak berhasil (sepertinya Spring tidak menangani jenis konvensi penamaan ini (yaitu untuk banyak Caps, terutama di awal - huruf ke-2 (tidak yakin apakah ini satu-satunya kasus)
atau
Saat saya mengganti nama kolom menjadi
solusi berikut saya berfungsi dengan baik tanpa masalah apa pun:
ATAU
sumber