web-dev-qa-db-ja.com

使用するもの:JPQLまたはCriteria API

My Javaアプリケーションは、オブジェクトの永続化にJPAを使用しています。ビジネスドメインは非常に単純です(それぞれ3〜5個のプロパティを持つ3つのクラスのみが永続的です)。クエリも単純です。どのアプローチを使用すべきか:JPQLまたはCriteria API?

65
yegor256

SOでこれがすでに説明されていると確信していますが、既存の質問が見つかりませんでした。そこで、質問に対する私の見解を以下に示します。

  • JPQLクエリの書き込み/読み取りが簡単になりました。
  • Criteria APIは、動的なクエリを作成するのに適しています。

これは基本的に Hibernate:Criteria vs. HQL にあります。

ただし、JPA 2.0 Criteria APIとHibernateのCriteria APIには、言及する価値のある大きな違いが1つあります。JPA2.0 Criteria APIはtypesafe APIであり、したがって、コンパイル時のチェック、コード補完、より良いリファクタリングのサポートなどを提供します。ただし、[〜#〜] i [〜#〜]は見つかりませんJPQLの使いやすさよりも利点が重要であること。

要約すると、動的なクエリ(複数条件検索機能など)を除き、JPQLを優先します。

関連する質問

その他のリソース

74
Pascal Thivent

以前に同様の質問に回答しましたが、コミュニティの利益のためにここに回答を再投稿します。以下の回答に対して、アプリケーションサーバーを使用していると仮定します。

Criteria APIは、SQLインジェクションを防ぐタイプセーフな方法で動的SQLクエリの構築を可能にするために存在します。それ以外の場合は、エラーが発生しやすくセキュリティ上のリスクがあるSQL文字列を連結することになります。つまり、SQLインジェクションです。 Criteria APIを使用する必要があるのは、このときだけです。

クエリは基本的に同じままですが、異なるパラメーターのみを受け入れる必要がある場合は、アノテーション付きの@NamedQueriesを使用する必要があります。

これは基本的に、基準クエリと@NamedQueriesに関する経験則です。私の経験では、Criteria APIを必要とすることはめったにありませんが、まれに必要な場合にのみ存在するのは良いことです。

お役に立てれば。

4
sagneta