7

Hibernateドキュメントによると、名前付きクエリの目的は、プロジェクト内のさまざまな場所から一部のxml内の単一の場所にHQLをクリアすることです(宣言型アプローチの場合)。つまり、クエリを変更する場合は再コンパイルは必要ありませんが、セッションファクトリのリロードは必須。これは、ほとんどの場合、クエリオブジェクトがキャッシュされるときにサーバーが起動することを意味します。しかし、アノテーションの場合、エンティティレベルで名前付きクエリを定義する必要があります。したがって、ここでもコンパイルが必要です。ここでの私の質問は、名前付きクエリがパフォーマンスにも役立つかどうかです。これが私の理解です:-

1)名前付きクエリを使用すると、クエリオブジェクトだけが第2レベルのキャッシュにキャッシュされます。クエリオブジェクトだけと言うときは、クエリ結果ではなくクエリ構文だけがキャッシュされることを意味します。その権利があれば、おそらくHQL becozの場合にのみ有用であり、HQLからネイティブクエリへの変換を回避できます。クエリが実行されるたびに、ある程度のパフォーマンスが得られます。

ただし、ネイティブSQLを使用している場合、その場合は変換が行われないため、名前付きクエリにはその利点はありません。

したがって、名前付きクエリの主な利点は、SQLの中央リポジトリを作成することです。はい、HQLの場合、ネイティブSQLへの変換時間を節約できますが、クエリオブジェクトはjvmの存続期間中存在し、メモリを消費することに注意してください。したがって、ここでトレードオフするものもあります。

4

1 に答える 1

10

名前付きクエリには、2つの小さな利点があります。

  • それらの構文はセッションファクトリの作成時にチェックされ、エラーが発生した場合にアプリケーションが迅速に失敗します(これはおそらくアプリケーションにいくつかの単体テストがないことを示しています)
  • それらはいくつかの場所からアクセスして使用できます(これはおそらく設計上の問題を示しています)

また、名前付きクエリを使用してコードを読み取ったりデバッグしたりする場合、定義を検索せずに実行されているクエリをすぐに確認できないという欠点もあります。

残りは本当に重要ではありません:

  • HQLクエリをSQLに変換するコストは、実際にクエリを実行するコストと比較してごくわずかです。
  • クエリをキャッシュするためのメモリコストは非常に小さいです。とにかく、Hibernateはすべてのエンティティのメタデータをメモリに保持する必要があることに注意してください。

私は、クエリが使用されるコードでクエリを定義し、それらを単体テストすることを好む傾向があります。これにより、コードがより読みやすく、より堅牢になります。

于 2013-03-24T08:34:46.537 に答える