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

Java 在CriteriaQuery期间初始化JPA实体的瞬态属性,java,jpa-2.0,criteria-api,Java,Jpa 2.0,Criteria Api,我想知道在条件查询期间是否可以初始化实体的临时属性 范例 @Entity public SampleEntity{ @Id private long id; [more attributes] @Transient private String someTransientString; [getters and setters] } 现在,我想编写一个CriteriaQuery,加载所有SampleEntitys,并自动将someTransientString设

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

范例

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}
现在,我想编写一个CriteriaQuery,加载所有
SampleEntity
s,并自动将
someTransientString
设置为
imamightlyfinestring
。我想到了类似以下SQL的东西:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 
我当然知道我可以简单地迭代生成的集合并手动设置属性,但我想知道是否有一种方法可以在JPA2中实现这一点


谢谢:)

不,您不能在查询中执行此操作

如果您可以在查询之外计算出someTransientString的值,那么可以使用回调(摘自JPA2.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";
}

您还可以在默认(即,无参数)构造函数中初始化瞬态

您可以看到,这就是在EclipseLink中使用的策略(请阅读以下链接中的最后一条评论):