有效解決JPA 和Hibernate 中的N 1 問題
當初始查詢擷取N 筆記錄時,就會出現N 1 查詢問題,且後續查詢會出現N 1 查詢問題。執行查詢以取得這 N 筆記錄中每筆記錄的關聯關係記錄。在 Hibernate 中克服此問題需要採取全面的方法。
理解問題
當您在未初始化關聯關係的情況下取得記錄時,就會出現 N 1 查詢問題。當您稍後嘗試存取該關係時,Hibernate 會執行其他查詢以取得所需的資訊。這會導致執行 N 1 個查詢,而不是單一查詢。
解決問題
要在 Hibernate 中解決此問題,有效的解決方案包括使用 JOIN FETCH條款。透過將此子句附加到您的初始查詢中,您可以急切地取得導致問題的關係:
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
如果您需要取得多個子關聯,建議在主查詢中取得集合,然後其餘的在單獨的查詢中。
自動偵測
至無縫偵測 N 1 查詢問題,強烈建議將自動 JUnit 斷言合併到整合測試中。 db-util 等工具提供了一個開源實用程序,用於驗證生成的 SQL 語句的數量,確保您的程式碼不會在不知不覺中遭受此效能瓶頸。
以上是如何有效解決JPA和Hibernate中的N 1問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!