0

JPQL クエリは、NEW演算子を使用してカスタム結果オブジェクトを返すことができます。

  SELECT NEW myPackage.MyVO(e.fieldX, e.relationshipX.fieldY)
  FROM MyEntity AS e

これは VO にフィードするのに非常に便利です。問題は、引数の数、順序、およびクエリ プロジェクションの型と正確に一致するコンストラクターを作成する必要があることです。これは、同じ VO に多くのプロジェクションを使用すると厄介になります... VO に 1 つの大きなコンストラクターがありNULL、クエリで多くのリテラルに頼るか、VO に多くの異なるコンストラクターが必要です。

私の質問は次のとおりです。JPQLで、コンストラクターの代わりにミューテーターを介して結果オブジェクトフィールドを設定する方法はありますか?

.NET のバックグラウンドを持つ人々にとって、私はLINQ + object initializerに相当するものを探しています。

4

2 に答える 2

1

簡単な回答いいえ、JPQL ではミューテーターを使用できません。

わかりませんがLINQ、混乱を引き起こさずにこれが行われるのを見ることはできません。

クラスが複数のコンストラクターを持つことができることを知っていると思います。では、あまりにも多くのフィードを必要としないコンストラクターを作成してみませんかnull

必要なものと使用している JPA 実装に応じて、ほとんどのプロバイダーはそれを回避する非標準的な方法を提供します@formula

JPA2 を使用している場合は、基準クエリの方が適している可能性があり、この種の処理を行うことができます。

を使用した方がよい場合もあります@PostLoad

いずれにせよ、この変換が SQL で発生しないことを知る必要があるため、実際には作業を SQL にオフロードしていません。一般的には、SQL が 1 回のヒットでできるだけ多くの作業を行うようにすることを好みます。

はい、これらは私の一般化であり、具体的な解決策や要件は適合しない場合があります。

于 2012-06-19T00:58:55.377 に答える
1

DataNucleus JPAは、非標準のアノテーションや呼び出しを使用せずに結果オブジェクトをインスタンス化する 2 つの方法を確実にサポートします。これは主に、JDO もサポートしており、JDO の要件があるという事実によって推進されます。

  1. 引数付きコンストラクターを使用した結果型(あなたが言うように)
  2. デフォルトのコンストラクターとセッターを使用した結果の型

そのような

TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class);

ここで、MyResultType にはセッター "setField1"、"setField2" があります。

于 2012-06-19T06:57:18.010 に答える