質問

Criteria API NamedQuery の間の決定に関するヒューリスティック/ベストプラクティス/ルールセットはありますか?

これまでの私の考え:
名前付きクエリは、一般的に読みやすくなっています。基準クエリはより柔軟です。
どちらもプリコンパイルされています。私は、名前付きクエリをできるだけ長く使用してから、基準に変更することに依存する傾向があります。

でも多分 基準APIを使用してクエリを「柔軟化」したいという衝動は、最適ではない設計(つまり、関心の分離)のヒントですか?

ありがとうございます

役に立ちましたか?

解決

名前付きクエリの方が最適です(一度解析/準備されます)。基準クエリは動的です(EclipseLinkなどの一部のJPAプロバイダーは基準準備キャッシュを維持していますが、プリコンパイルされていません)。

基準は動的クエリにのみ使用します。

他のヒント

基準クエリは、変数や複数の検索条件などに基づいてクエリを動的に生成する必要がある場合に適しています。

静的クエリの場合、JPQLの方がはるかに読みやすく、基準クエリよりも使用する方が好きです。安全性がいくらか失われる可能性がありますが、単体テストにより自信が持てるようになります。

もう1つの観点は、条件クエリはそれほど読みやすくはありませんが、タイプセーフであるため、コンパイル時のタイプチェックを提供するというものです。多くのエンティティと多くのクエリがあるプロジェクトでデータベースを変更する場合、コンパイル時に、変更が原因でどのクエリが失敗したかを確認すると非常に役立ちます。

一方、それがJPQLのシンプルさよりも有益かどうかはわかりません

実際にHibernate(4.3.0-SNAPSHOT)ソースとEclipseLink(2.5.0-SNAPSHOT)ソースを調べ、それぞれのJPA実装を調べました。

EclipseLinkは、あなたが説明した方法では明らかにスレッドセーフではありません。具体的には、結合を繰り返し再計算しようとします。

Hibernateの実装は私にはスレッドセーフに見えます。100%確信はありませんが、確かにそうです。指定されていないため、これが将来的に当てはまるとは限りません。

しかし、私はあなたに警告します、私はあなたが多くを得るつもりはないと思います。私が見ているところによると、クエリのコンパイルの多くは実際には「createQuery」フェーズで行われるため、結果をキャッシュすることすらできません。

JPAは、@ NamedQueryアノテーションと@NamedQueriesアノテーションを使用して、名前付きクエリとして静的クエリを作成する方法も提供します。可能であれば、動的クエリよりも名前付きクエリを優先することは、JPAでは良い習慣であると考えられています。 http://www.objectdb.com/java/jpa/query/api

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top