6

新しい同僚が、XxxxRepository クラスに HQL を埋め込む代わりに、Hibernate で注釈付きの名前付き HQL クエリ (つまり @NamedQuery) を使用することを提案しました。

私が知りたいのは、アノテーションを使用すると、クエリを集中化する以外に利点があるかどうかです。

特に、Repository メソッドが実行されるたびにクエリが解析されるのではなく、クラスがロードされたときに 1 回だけクエリが解析されるため、パフォーマンスが向上しますか?

4

4 に答える 4

8

Pro EJB 3 (Mike Keith) より:

「...可能な限り名前付きクエリをお勧めします。永続化プロバイダーは、多くの場合、アプリケーションのデプロイまたは初期化フェーズの一部として、JPQL の名前付きクエリを SQL にプリコンパイルするための手順を実行します。」

この本は JPA に関するものですが、一般的なアドバイスは Hibernate に適用されます。ただし、Hibernate キャッシュは HQL/JPQL を解析したため、パフォーマンスが大幅に向上することはおそらくないでしょう。名前付きクエリを使用するもう 1 つの利点は、デプロイ時にアプリケーションを再構築することなく、マッピング ファイルを使用してクエリをオーバーライドできることです。本番環境でクエリを微調整する必要がある場合に役立ちます。

于 2010-04-15T00:54:11.387 に答える
5

考えられるパフォーマンスの向上とは別に、注釈付きの HQL クエリを使用することで、SQL インジェクション攻撃から身を守ることができるという別の利点があると思います。

Web アプリケーションの場合、クエリにユーザー入力データが含まれている場合、これは重要です。

http://en.wikipedia.org/wiki/SQL_injection

于 2010-04-15T01:25:34.193 に答える
3

SQL インジェクションに関するラーズのコメントは誤解を招く可能性がありますが、それが彼の意図ではないと思います。コメントが誤解されないように、もう少し背景を説明したいと思います。

名前付きクエリが仕様によってパラメーター化されることは事実であり、名前付きパラメーターの使用は SQL インジェクションから保護するための 1 つのステップです。ただし、SQL インジェクションから完全に保護するわけではありません (詳細については、彼のリンクを参照してください)。コメントの文言は、名前付きクエリの使用が、インジェクション攻撃から保護するために必要な唯一のステップであることを示唆しています。実際には、通常のクエリはパラメーター化することができ (そしてそうすべきです)、名前付きクエリとまったく同じレベルのインジェクション攻撃からの隔離を提供します。クエリのパラメーター化は、インジェクション攻撃を阻止するために必要な多くの手順の 1 つにすぎません。

Web アプリケーションに関する Lars のコメントに付け加えると、アプリケーションが外部に面しているかどうか、または入力データがユーザーからのものか別のデータベースからのものか (または同じデータベース)。

于 2011-03-09T14:49:35.923 に答える
2

個人的には、サーバーの起動時にhqlクエリが解析され、hqlクエリが間違っている場合にインスタントメッセージが表示されるという事実よりも、パフォーマンスの向上は重要ではないと思います。

テスト中ではなく、テスト前にこれらのエラーをキャッチすることを好みます。

前回、テスト中に、CaSiNgが原因で機能しなかった、実際には機能しなかったコード内のクエリに遭遇しました。これは、名前付きクエリを使用する場合、サーバーの起動時にすぐに明らかになります。

そしてもちろん、HQLをJavaコードと混合するのは嫌いです。

于 2011-10-02T11:07:45.930 に答える