26

休止状態またはその逆で@NamedQueryoverを使用する利点はありますか。@NamedNativeQuery正確な違いや、どのコンテキストで使用する必要があるかを見つけることができませ@NamedQuery@NamedNativeQuery

前もって感謝します。

4

3 に答える 3

35

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

一般に、HQL クエリを作成することをお勧めします。そうすれば、Hibernate に HQL をさまざまな SQL ダイアレクトに変換する複雑な処理を任せることができるからです。これにより、DBMS プロバイダーの切り替えを選択したときに、作業が大幅に簡素化されます。

于 2012-12-19T14:54:21.080 に答える
11

パフォーマンスについて考えるときは、ボンネットの下で何が起こっているかについて知っておく必要があります。

単純な JDBC を使用して何かをプログラミングしたことがあると思います。そのため、クエリをドライバーに渡し、データベースに送信する方法を知っています。HQL または JPA-QL を使用する場合、クエリは最初にデータベースが理解できる SQL 言語に解析する必要があります。この場合、間に追加の解析ステップがあります。ストアド プロシージャ コールを含むネイティブ SQL クエリでは、持続性フレームワークが引き続き JDBC 結果セットを持続性オブジェクトのグラフにマッピングすることに注意してください。

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

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

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

于 2012-12-19T14:59:35.773 に答える
8

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

于 2012-12-19T14:54:17.450 に答える