在CriteriaQuery期间初始化JPA实体的瞬态属性

ftr*_*ftr 11 java criteria-api jpa-2.0

我想知道在条件查询期间是否可以初始化实体的瞬态属性.

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}
Run Code Online (Sandbox Code Playgroud)

现在我想编写一个CriteriaQuery来加载所有SampleEntitys并自动设置someTransientStringimamightlyfinestring.我有类似以下SQL的内容:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 
Run Code Online (Sandbox Code Playgroud)

我当然知道我可以简单地迭代生成的集合并手动设置属性,但我想知道是否有办法在JPA2中完成它.

谢谢 :)

Mik*_*unu 13

不,你不能在查询中这样做.

如果你可以在查询之外找出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";
}
Run Code Online (Sandbox Code Playgroud)