我想知道在条件查询期间是否可以初始化实体的瞬态属性。
例
@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的值,你可以使用 餐后 回调(摘自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";
}
不,你不能在查询中这样做。
如果你可以在查询之外找出someTransientString的值,你可以使用 餐后 回调(摘自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";
}
您还可以在默认(即无参数)构造函数中初始化瞬变。
您可以看到这是使用的策略,例如,在EclipseLink中(阅读以下链接中的最后一条评论):
https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385