Saya melihat ke Spring Data JPA. Pertimbangkan contoh di bawah ini di mana saya akan mendapatkan semua fungsi crud dan finder bekerja secara default dan jika saya ingin menyesuaikan finder maka itu juga dapat dilakukan dengan mudah di antarmuka itu sendiri.
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
Saya ingin tahu bagaimana cara menambahkan metode kustom lengkap dengan implementasinya untuk AccountRepository di atas? Karena ini sebuah Interface, saya tidak dapat mengimplementasikan metode di sana.
sumber
AccountRepositoryImpl
tidak :,AccountRepositoryCustomImpl
dll. - itu adalah konvensi penamaan yang sangat ketat.Error creating bean with name 'accountRepositoryImpl': Bean with name 'accountRepositoryImpl' has been injected into other beans [accountRepository] in its raw version as part of a circular reference, but has eventually been wrapped.
QueryDslRepositorySupport
Anda juga harus menyuntikkan repositori melalui bidang atau penyetel penyuntikan daripada injeksi konstruktor kalau tidak itu tidak akan dapat membuat kacang. Tampaknya berhasil tetapi solusinya terasa agak 'kotor', saya tidak yakin apakah ada rencana untuk meningkatkan cara kerjanya dari tim Data Spring.Selain jawaban axtavt , jangan lupa Anda bisa menyuntikkan Entity Manager dalam implementasi kustom Anda jika Anda membutuhkannya untuk membangun kueri Anda:
sumber
Jawaban yang diterima berfungsi, tetapi memiliki tiga masalah:
AccountRepositoryImpl
. The dokumentasi jelas menyatakan bahwa mereka telah disebutAccountRepositoryCustomImpl
, nama antarmuka kustom ditambahImpl
@Autowired
, yang dianggap praktik burukSaya menemukan cara untuk membuatnya sempurna, meskipun bukan tanpa menggunakan fitur Data Spring tanpa dokumen lainnya:
sumber
accountRepositoryBasic
). Kalau tidak, pegas mengeluh karena ada 2 pilihan kacang untuk injeksi ke*Impl
konstruktor saya .AccountRepositoryBasic
danAccountRepositoryCustom
akan tersedia melalui disuntikkanAccountRepository
Ini terbatas dalam penggunaan, tetapi untuk metode kustom sederhana Anda dapat menggunakan metode antarmuka standar seperti:
EDIT:
Dalam tutorial musim semi ini tertulis:
Jadi bahkan mungkin untuk mendeklarasikan metode seperti:
dan jika objek
Hobby
adalah properti Pelanggan maka Spring akan secara otomatis menentukan metode untuk Anda.sumber
Saya menggunakan kode berikut untuk mengakses metode menemukan yang dihasilkan dari implementasi kustom saya. Mendapatkan implementasi melalui pabrik kacang mencegah masalah pembuatan kacang bundar.
sumber
Seperti yang dijelaskan dalam fungsionalitas yang didokumentasikan ,
Impl
akhiran memungkinkan kita untuk memiliki solusi bersih:@Repository
antarmuka, katakanlahMyEntityRepository
, baik metode Data Musim Semi atau metode khususMyEntityRepositoryImpl
(Impl
akhiran adalah keajaiban) di mana saja (bahkan tidak perlu berada dalam paket yang sama) yang mengimplementasikan metode khusus saja dan membubuhi keterangan kelas tersebut dengan@Component
** (@Repository
tidak akan berfungsi).MyEntityRepository
melalui@Autowired
untuk digunakan dalam metode khusus.Contoh:
Kelas entitas:
Antarmuka repositori:
Kacang penerapan metode khusus:
Kelemahan kecil yang saya identifikasi adalah:
Impl
kelas ditandai sebagai tidak digunakan oleh kompiler, dengan demikian@SuppressWarnings("unused")
sarannya.Impl
kelas. (Sedangkan dalam implementasi antarmuka fragmen biasa , dokumen menyarankan Anda dapat memiliki banyak.)sumber
MyEntityRepository
, bukan*Impl
.Jika Anda ingin dapat melakukan operasi yang lebih canggih, Anda mungkin memerlukan akses ke internal Spring Data, dalam hal ini bekerja sebagai berikut (sebagai solusi sementara saya untuk DATAJPA-422 ):
sumber
Mempertimbangkan cuplikan kode Anda, harap dicatat bahwa Anda hanya dapat meneruskan objek Asli ke metode findBy ###, katakanlah Anda ingin memuat daftar akun yang termasuk pelanggan tertentu, salah satu solusinya adalah melakukan ini,
Buat menuntut nama tabel yang akan ditanyakan sama dengan kelas Entity. Untuk implementasi lebih lanjut, silakan lihat ini
sumber
Ada masalah lain yang harus dipertimbangkan di sini. Beberapa orang berharap bahwa menambahkan metode khusus ke repositori Anda akan secara otomatis mengekspos mereka sebagai layanan REST di bawah tautan '/ cari'. Sayangnya ini tidak terjadi. Spring tidak mendukung itu saat ini.
Ini adalah fitur 'menurut desain', pegas data sisanya secara eksplisit memeriksa apakah metode adalah metode khusus dan tidak memaparkannya sebagai tautan pencarian REST:
Ini adalah qoute dari Oliver Gierke:
Untuk detail lebih lanjut lihat masalah ini: https://jira.spring.io/browse/DATAREST-206
sumber
@RestResource(path = "myQueryMethod")
anotasi ke metode tersebut. Kutipan di atas hanya menyatakan bahwa Spring tidak tahu bagaimana Anda ingin memetakannya (mis. GET vs POST dll.) Sehingga terserah Anda untuk menentukannya melalui anotasi.Menambahkan perilaku khusus ke semua repositori:
Untuk menambahkan perilaku kustom ke semua repositori, Anda pertama-tama menambahkan antarmuka perantara untuk mendeklarasikan perilaku bersama.
Sekarang masing-masing antarmuka repositori Anda akan memperluas antarmuka perantara ini alih-alih antarmuka Repositori untuk memasukkan fungsi yang dideklarasikan.
Selanjutnya, buat implementasi antarmuka perantara yang memperluas kelas dasar repositori spesifik teknologi persistensi. Kelas ini kemudian akan bertindak sebagai kelas basis kustom untuk proksi repositori.
Repositori Data Musim Semi Bagian I. Referensi
sumber
Saya memperluas penyimpanan SimpleJpaRepository:
dan menambahkan kelas ini ke @EnableJpaRepositoryries repositoryBaseClass.
sumber