2012-04-25 11 views
11

基準クエリ中にエンティティの一時的な属性を初期化できるかどうかは疑問です。CriteriaQuery中にJPAエンティティの一時属性を初期化する

@Entity 
public SampleEntity{ 

    @Id 
    private long id; 

    [more attributes] 

    @Transient 
    private String someTransientString; 

    [getters and setters] 
} 

今、私はすべてのSampleEntity Sを読み込み、自動的にimamightlyfinestringsomeTransientStringを設定CriteriaQueryを構成します。私は心の中で次のSQLのようなものを持っている:

もちろんの
SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 

私は単に結果のコレクションを反復処理し、手動で属性を設定することができることを知っているが、JPA2の中でそれを行う方法がある場合、私は思ったんだけど。

ありがとうございました:)

答えて

11

いいえ、あなたは照会できません。エンティティがロードさ された後、エンティティのためのポストロードメソッドが呼び出される

:あなたは、クエリの外someTransientStringの値を把握することができます場合は

、あなたはPostLoadコールバック(JPA 2.0仕様からの抜粋)を使用することができますデータベースから現在のパーシスタンス・コンテキストに移動するか、 の後にリフレッシュ操作が適用されます。 PostLoadメソッドは、クエリ結果が返されるか、またはアクセスされる前、または の関連付けがトラバースされる前に、 が呼び出されます。

ちょうどあなたのエンティティに次の行を追加します。

@PostLoad 
protected void initSomeTransientString() { 
    //Likely some more complex logic to figure out value, 
    //if it is this simple, just set it directly in field declaration. 
    someTransientString = "imamightilyfinestring"; 
} 
+0

おかげで、私はできるだけ多く考え出し。 – ftr

0

ます。また、デフォルト(つまり、引数なし)コンストラクタであなたのトランジェントを初期化することができます。あなたが例えば、EclipseLinkの中に(次のリンクの最後のコメントを読んで)、これは使用される戦略であることがわかります

https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385

関連する問題