首頁 > Java > java教程 > 如何解決 JPA 和 Hibernate 中的 N 1 查詢問題?

如何解決 JPA 和 Hibernate 中的 N 1 查詢問題?

Susan Sarandon
發布: 2024-11-17 07:40:03
原創
194 人瀏覽過

How Can You Address the N 1 Query Issue in JPA and Hibernate?

解決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();

List postTags = 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板