3

私は、永続化プロバイダーとして Hibernate を使用する J2EE 6 コードベースに取り組んでいます。私の経験はSpringの方が多く、JPAアノテーションなどにはまったく慣れていませんが、すべてのエンティティクラスでこれがたくさんあることに気づき、驚いています.@NamedQueryは複雑なSQLに向いていると思いましたか? 確かに、これらの単純な選択 (および休止状態のマッピングで定義されている結合) は、SQL を書き出さずに実行できますか?

In the Entity:
@NamedQueries({
@NamedQuery(name = "DealRaw.findByrawUrl", query = "SELECT d FROM DealRaw d WHERE d.rawUrl = :rawUrl"),
@NamedQuery(name = "DealRaw.findByState", query = "SELECT d FROM DealRaw d WHERE d.state = :state"),
.... etc ....
})

その後

In the Service Class
Query qR=_em.createNamedQuery("DealRaw.findByrawUrl");  //_em is an EntityManager
qR.setParameter("rawUrl", value);
List<DealRaw> dRs=(List <DealRaw>)qR.getResultList();
4

3 に答える 3

2

これらのクエリはSQLクエリではなく、JPQLクエリです。また、複雑かどうかに関係なく、名前付きクエリ内に任意の種類のクエリを配置できます。

それらはすべて同じ利点があります:

  • JPAエンジンは、起動時にクエリを解析および検証し、解析の結果をキャッシュして、何度も解析されないようにする場合があります。
  • 同じクエリがコード内のいくつかの場所で簡単に使用される可能性があります(ただし、それは疑わしい設計になります)

それらはすべて同じ欠点があります。IMO:クエリはどこで使用されるかが定義されていないため、コードを理解するのが難しくなります。

これらのクエリに名前が付けられているかどうかに関係なく、これらのクエリを実行するには、これらのクエリを作成する必要があります。エンティティをロードする他の唯一の方法は、IDを使用してエンティティを見つけるか(ここでは当てはまりません)、関連付けを使用して1つのエンティティから別のエンティティに移動することです(これも当てはまりません)。

于 2011-10-31T17:55:19.553 に答える
1

NamedQuery を使用する代わりに Criteria を使用しないのはなぜですか? フィルタリングがはるかに簡単になります。場合によっては、基準の作成が非常に混乱して難しくなりますが、単一の列の場合はそれが最も簡単なオプションだと思います。

于 2011-10-31T18:10:54.357 に答える
1

JB Nizet が言ったように、結果セットを見つけるには、クエリをどこかに記述する必要があります。

それらを NamedQuery (またはそれが必要な場合は CriteriaQuery) として使用する利点の 1 つは、SQL インジェクションから身を守ることができることです。クエリが、名前付きパラメータなどの文字列連結を使用して、または名前付きパラメータを使用してコード内でその場で作成される場合String query = "SELECT d FROM DealRaw d WHERE d.rawUrl = '" + rawUrl + "'";、将来、一部のプログラマが登場して、SQL インジェクションを可能にする方法でクエリを変更する可能性があります (例のように)。

はい、連結を使用してコードで構築されたクエリで名前付きパラメーターを使用する方法はありますが、事前定義された名前付きクエリほど保護されません。

于 2011-10-31T19:02:28.760 に答える