解決JPA 和Hibernate 中的N 1 問題
在JPA 和Hibernate 中,當執行多個查詢時會出現N 1 查詢問題檢索相關數據,導致資料擷取效率低。為了解決這個問題,Hibernate 提供了一系列技術。
瞭解 N 1 問題
當初始查詢擷取主實體並觸發後續查詢時,會出現此問題以取得相關資料。例如,取得 PostComment 實體而不預取相關的 Post 實體將強制 Hibernate 對每個存取的 Post 實例執行額外的查詢。
Hibernate 中的解
1。連線取得:
透過利用「連線取得」策略,可以在單一查詢中與主要實體一起擷取相關資料。在我們的範例中,我們可以使用:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2。集合預取:
在取得主要實體的集合和相關資料的附加集合時,建議預先取後者。一種選擇是在初始查詢中預取集合:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3。二次查詢:
預取效率不高或需要取得多個子關聯的情況下,可以採用二次查詢策略。使用基本查詢檢索主要實體,並使用後續查詢來取得相關資料。
使用 db-util 自動偵測
db-util 函式庫提供了自動偵測 N 1 查詢問題的方法。 JUnit 斷言可用於驗證產生的 SQL 語句的預期數量,從而在開發過程的早期發現問題。
以上是如何解決 JPA 和 Hibernate 中的 N 1 查詢問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!