Apabila menggunakan Spring JPA untuk mendapatkan semula perhubungan entiti, kadangkala kami perlu mengehadkan hasil untuk memenuhi keperluan perniagaan tertentu. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Spring JPA untuk mendapatkan semula perhubungan entiti terhad. Dengan menggunakan anotasi pertanyaan dan kaedah yang disediakan oleh Spring JPA, kami boleh melaksanakan sekatan ke atas perhubungan entiti dengan mudah, dengan itu meningkatkan kecekapan dan ketepatan pertanyaan. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda panduan yang jelas dan contoh praktikal untuk membantu anda memahami dengan lebih baik dan menggunakan keupayaan mendapatkan semula perhubungan entiti Spring JPA.
Ini ialah masalah pengoptimuman tentang perhubungan dan pangkalan data pergi-balik.
tl;dr: Anda mempunyai dua entiti a dan b, yang mempunyai hubungan banyak-ke-banyak. Anda perlu mendapatkan semula tika a dan subset khusus entiti b berkaitannya. Ini adalah bahagian penting, anda tidak mahu mendapatkan semula semua entiti yang berkaitan dengan tika b ini, tetapi hanya subset daripadanya.
Panggilan panjang
Pertimbangkan entiti berikut
public class a { @id private long id; @manytomany private list<b> blist; }
public class B { @Id private Long id; @ManyToMany private List<A> aList; private Boolean somePropertyToUseWhileFiltering; }
Saya cuba mendapatkan semula tika entiti dan subset kejadian b yang berkaitan. Pada pendapat saya, ini boleh dicapai dengan tiga cara
Dapatkan semua entiti b yang berkaitan semasa mendapatkan semula a dan buang entiti yang anda tidak perlukan.
Buat dua panggilan repositori berbeza menggunakan hubungan malas: mula-mula dapatkan tika tanpa tika b yang berkaitan, kemudian dapatkan tika b yang menyatakan penapis dan sekatan yang diperlukan.
Tulis pertanyaan jpql atau sql tersuai yang besar untuk mendapatkan subset tertentu bagi kejadian dan kejadian b yang berkaitan.
Saya tidak suka kaedah pertama sama sekali kerana ia mendapatkan banyak baris yang tidak perlu. Pendekatan ketiga mungkin adalah yang terbaik untuk struktur kompleks, tetapi mengapa saya menggunakan struktur orm di tempat pertama?
Secara teori semua ini sepatutnya berfungsi, saya sedang menggunakan kaedah kedua tetapi saya mempunyai kebimbangan. Adakah berbahaya untuk membuat beberapa panggilan repositori ke repositori yang berbeza untuk satu permintaan? Kerana saya mempunyai struktur entiti yang kompleks dengan banyak perhubungan. Saya rasa ini akan meningkatkan bilangan perjalanan pergi dan balik ke pangkalan data.
Adakah cara lain yang lebih sesuai untuk menyelesaikan masalah ini?
Saya rasa anda boleh menggunakan unjuran bersarang: Unjuran
public interface awithfilteredblistprojection { long getid(); list<bprojection> getfilteredblist(); interface bprojection { string getsomepropertytousewhilefiltering(); // add other properties from b that you want to include } }
Repositori
public interface ARepository extends JpaRepository<A, Long> { @Query("SELECT a FROM A a JOIN FETCH a.bList b WHERE a.id = :aId") Optional<AWithFilteredBListProjection> findAWithFilteredBList(@Param("aId") Long aId); }
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan semula perhubungan entiti terhad menggunakan Spring JPA?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!