web-dev-qa-db-ja.com

@NamedNativeQueryより@NamedQuery

休止状態またはその逆で@NamedQueryよりも@NamedNativeQueryを使用する利点はありますか?正確な違い、またはどのコンテキストで@NamedQueryを使用すべきか@NamedNativeQueryを特定できない

前もって感謝します。

24
Abhi

@NamedNativeQueryを使用すると、名前付きSQLクエリを記述できますが、@NamedQueryを使用すると、名前付きのHQLクエリ(またはJPQL)を記述できます。

HQLをさまざまなSQL方言に変換する複雑な処理をHibernateに処理させることができるため、一般的にはHQLクエリを作成することをお勧めします。これにより、DBMSプロバイダーを切り替えることを選択した場合の作業がはるかに簡単になります。

34
Oleksi

パフォーマンスについて考えるとき、内部で何が起こっているかについて何かを知っている必要があります。

おそらく単純なJDBCを使用して何かをプログラミングしたので、クエリをドライバーに渡し、データベースに送信する方法を知っています。 HQLまたはJPA-QLを使用する場合、まずクエリを解析して、データベースが理解できるSQL言語にする必要があります。この場合、その間に追加の解析ステップがあります。ストアドプロシージャの呼び出しを含むネイティブSQLクエリでも、永続フレームワークはJDBC結果セットを永続オブジェクトのグラフにマッピングする処理を行います。

たとえば、データベース管理システムのクエリオプティマイザーに指示するネイティブSQLヒントを含める場合は、SQLを自分で作成する必要があります。 HQLとJPA-QLには、このためのキーワードはありません。

マッピング、つまりアプリケーションが特定のデータベースでのみ機能するため、マッピングメタデータにネイティブSQLを配置することの欠点は、データベースの移植性が失われることです。しかし、すべてのデータベースで機能するフレームワークを作成していない可能性があるため、通常はこれは軽微な問題です。

クエリのパフォーマンスを低下させたい場合は、データベースを調べて実行計画を確認する必要があります。DBAは、何が最適で何が最適化できるかを正確に伝えることができます。

10
George D

@NamedQueryはクエリ言語(HQLまたは永続クエリ言語)で構築する必要があります。 @NamedNativeQueryはネイティブSQLで構築する必要があります。

7
Jeff