解決JPA 和Hibernate 中的N 1 問題
當執行過多的查詢來擷取關聯式資料時,就會出現N 1問題。例如,在 Hibernate 中,初始查詢會取得 N 筆記錄,並且需要 N 個附加查詢來擷取每筆記錄的關聯記錄。
要解決此問題,請使用 JOIN FETCH:
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review" ) .setParameter("review", review) .getResultList();
此 JOIN FETCH 急切獲取後關聯,從而消除了 N 1 個查詢。
如果需要取得多個子關聯,在初始查詢中取得一個集合,並在後續查詢中取得其他集合。
自動偵測
整合測試非常適合偵測 N 1 問題。 db-util 專案提供了自動 JUnit 斷言來驗證產生的 SQL 語句的預期數量:
@Test public void shouldNotHaveANPlusOneQuery() { // code to configure and execute db-util Assert.assertCountOfSqlStatementsPerformed(1); }
以上是如何解決JPA和Hibernate中的N 1問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!