首頁  >  文章  >  如何使用 Spring JPA 擷取有限制的實體關係?

如何使用 Spring JPA 擷取有限制的實體關係?

王林
王林轉載
2024-02-08 22:20:101162瀏覽

在使用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 實例的子集。在我看來,這可以透過三種方式實現;

  1. 在檢索 a 的同時取得所有相關的 b 實體,並丟棄不需要的實體。

  2. 使用惰性關係進行兩個不同的儲存庫呼叫:首先取得沒有相關 b 實例的 a 實例,然後取得指定所需篩選器和限制的 b 實例。

  3. 編寫一個龐大的自訂 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除