我正在使用 Spring Boot 和 Hibernate。
一些復雜的邏輯,由業務決定,需要使用各種嵌套欄位,這些欄位遍歷各種DB關系(同樣,有些是NxN、Nx1、1xN、1x1)。
遇到N 1問題,一開始用HQL解決了,但是有些查詢需要多次join,結果集變得難以管理。
我開始研究一個自定義實用程式,它收集需要獲取的事物的 id,一次獲取它們,然后使用 setter 填充起始物件上的欄位。此實用程式適用于多對一關系,但對于多對多關系仍然效率低下,因為當我收集 id 時它退回到 N 1 問題(因為它通過 getter 為每個物件查詢一次連接表)。
我該如何解決這個問題?這個問題真的沒有解決嗎?我是否缺少一些可以自動解決此問題的明顯設定?
編輯: 我做了一個帶有一些評論的玩具示例:https : //github.com/marcotama/n-1-queries-example
uj5u.com熱心網友回復:
我遇到了同樣的情況,我有 3 種方法來解決它;
- 增加依賴屬性的fetchsize,以便批量執行查詢
- 為此目的撰寫自定義查詢
- 定義物體圖關系并相應地映射到屬性
我個人更喜歡第三個選項,因為這樣做很方便,并且使用 spring 資料 JPA 更干凈。
您可以參考以下答案的評論中的示例:
- Spring Data JPA 和 NamedEntityGraphs
- JPA和Hibernate中N 1問題的解決方案是什么?
uj5u.com熱心網友回復:
自己撰寫獲取邏輯。例如,您有擁有書籍的作者, author_devices 您可以將 fetch author 與書籍一起使用。您可以使用存盤庫“where author_id IN (authorsList.stream().map(author.getId())”)單獨獲取 author_devices。您應該分離作者并迭代 author_devices 并將其分配給適當的作者設備串列。我認為這只是對于需要加入-獲取超過 1 個關系的情況的適當解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384505.html
上一篇:JPA清除快取以讀取一項
