11

基準クエリ中にエンティティの一時的な属性を初期化できるかどうか疑問に思っています。

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

SampleEntityここで、すべてのをロードし、自動的にに設定someTransientStringするCriteriaQueryを作成しますimamightlyfinestring。私は次のSQLのようなものを念頭に置いています:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 

もちろん、結果のコレクションを繰り返して手動で属性を設定できることは知っていますが、JPA2内でそれを行う方法があるかどうか疑問に思っています。

ありがとう :)

4

2 に答える 2

14

いいえ、クエリではできません。

クエリの外で someTransientString の値を把握できる場合は、PostLoadコールバックを使用できます (JPA 2.0 仕様からの抜粋)。

エンティティの PostLoad メソッドは、エンティティがデータベースから現在の永続化コンテキストにロードされた後、またはエンティティに更新操作が適用された後に呼び出されます。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";
}
于 2012-04-25T17:05:18.663 に答える
0

デフォルト (つまり、引数なし) コンストラクターでトランジェントを初期化することもできます。

これは、たとえば EclipseLink で使用されている戦略であることがわかります (次のリンクの最後のコメントを読んでください)。

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

于 2015-05-08T10:32:11.317 に答える