ホームページ >Java >&#&チュートリアル >JPA と Hibernate での N 1 クエリの問題にどのように対処できるでしょうか?

JPA と Hibernate での N 1 クエリの問題にどのように対処できるでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-13 06:26:021040ブラウズ

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

JPA と Hibernate における N 1 クエリの問題への対処

N 1 問題は、クエリが N レコードを取得し、後続のクエリがフェッチ関連を行う場合に発生します。レコードが増加し、さらに N 個のクエリが発生します。これは、最初のクエリ中に関連付けがフェッチされなかった場合に Hibernate で発生する可能性があります。

原因と結果

説明のために、PostComment エンティティを取得する次の JPA クエリを考えてみましょう。

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc where pc.review = :review", PostComment.class)
.setParameter("review", review)
.getResultList();

その後コメントを反復処理して投稿の関連付けにアクセスすると、Hibernate は次の SQL ステートメント:

SELECT pc.id AS id1_1_, pc.post_id AS post_id3_1_, pc.review AS review2_1_
FROM   post_comment pc
WHERE  pc.review = 'Excellent!'

INFO - Loaded 3 comments

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 1

INFO - The post title is 'Post nr. 1'

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 2

INFO - The post title is 'Post nr. 2'

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 3

INFO - The post title is 'Post nr. 3'

ここでは、各コメントの Post エンティティを取得するために 3 つの追加クエリが実行されます。これは N 1 クエリの問題です。

解決策

これを解決するには、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();

複数の子関連付けの場合は、最初のクエリで 1 つのコレクションをフェッチし、残りを 2 番目のクエリでロードすることをお勧めします。 queries.

自動検出

N 1 の問題を検出するには、SQL ログとアサートを使用した統合テストを実装して、生成される SQL ステートメントの予想数を確認することが有益です。 db-util などのツールは、このプロセスを支援します。

以上がJPA と Hibernate での N 1 クエリの問題にどのように対処できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。