在使用Spring JPA進行實體關係檢索時,我們有時需要對結果進行限制,以滿足特定的業務需求。在本文中,我們將介紹如何使用Spring JPA來擷取有限制的實體關係。透過使用Spring JPA提供的查詢註解和方法,我們可以輕鬆實現對實體關係的限制,從而提高查詢的效率和準確性。無論您是初學者還是有經驗的開發人員,本文都將為您提供清晰的指導和實用的範例,幫助您更好地理解和應用Spring JPA的實體關係檢索功能。
這是一個關於關係和資料庫往返的最佳化問題。
tl;dr:您有兩個實體 a 和 b,它們具有多對多關係。您需要檢索 a 的實例及其相關 b 實體的特定子集。 這是重要的部分,您不想檢索與該 a 實例相關的所有 b 實體,而只想檢索其中的子集。
長話
考慮以下實體;
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; }
我正在嘗試檢索 a 實體的實例及其相關 b 實例的子集。在我看來,這可以透過三種方式實現;
在檢索 a 的同時取得所有相關的 b 實體,並丟棄不需要的實體。
使用惰性關係進行兩個不同的儲存庫呼叫:首先取得沒有相關 b 實例的 a 實例,然後取得指定所需篩選器和限制的 b 實例。
編寫一個龐大的自訂 jpql 或 sql 查詢,以取得 a 實例和相關 b 實例的特定子集。
我根本不喜歡第一種方法,因為它會檢索很多不必要的行。第三種方法可能是複雜結構的最佳方法,但是為什麼我要先使用 orm 結構呢?
理論上所有這些都應該有效,我目前正在使用第二種方法,但我有一個擔憂。對不同儲存庫進行多個儲存庫呼叫對於單一請求來說是否有害?因為我有一個複雜的實體結構,有很多關係。我猜這會增加資料庫的往返次數。
還有其他更合適的方法來解決這個問題嗎?
我認為你可以使用巢狀投影: 投影
public interface awithfilteredblistprojection { long getid(); list<bprojection> getfilteredblist(); interface bprojection { string getsomepropertytousewhilefiltering(); // add other properties from b that you want to include } }
儲存庫
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); }
以上是如何使用 Spring JPA 擷取有限制的實體關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!