11

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

例子

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

现在我想编写一个 CriteriaQuery 加载所有SampleEntitys 并自动设置someTransientStringimamightlyfinestring. 我想到了以下 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 回答