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

Susan Sarandon
リリース: 2024-11-17 07:40:03
オリジナル
120 人が閲覧しました

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

JPA と Hibernate の N 1 問題への対処

JPA と Hibernate では、複数のクエリが実行されると N 1 クエリの問題が発生します。関連データを取得するため、データのフェッチが非効率になります。この問題を解決するために、Hibernate はさまざまなテクニックを提供しています。

N 1 問題を理解する

この問題は、最初のクエリがプライマリ エンティティを取得し、後続のクエリがトリガーされるときに発生します。関連データを取得します。たとえば、関連する Post エンティティをプリフェッチせずに PostComment エンティティをフェッチすると、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 を使用できます。コレクションのプリフェッチ:

プライマリ エンティティのコレクションと関連データの追加コレクションをフェッチするときは、後者をプリフェッチすることをお勧めします。 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();

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート