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

时间:2012-04-25 10:09:33

标签: java jpa-2.0 criteria-api

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

实施例

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

现在,我想撰写一个CriteriaQuery,加载所有SampleEntity并自动将someTransientString设置为imamightlyfinestring。我有类似以下SQL的内容:

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

我当然知道我可以简单地迭代生成的集合并手动设置属性,但我想知道是否有办法在JPA2中执行此操作。

谢谢:)

1 个答案:

答案 0 :(得分:12)

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

如果你可以在查询之外找出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";
}