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


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

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

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

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

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

谢谢 :)


4711
2018-04-25 10:09


起源



答案:


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

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

12
2018-04-25 17:05



谢谢,我想了多少。 - ftr


答案:


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

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

12
2018-04-25 17:05



谢谢,我想了多少。 - ftr


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

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

https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385


0
2018-05-08 10:32