CriteriaQuery中时初始化JPA实体的瞬态特性(Initializing a transi

2019-06-23 23:19发布

我不知道是否有可能一个条件查询时初始化一个实体的瞬态特性。

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

现在我想编写一个加载一个CriteriaQuery中SampleEntity S和自动设置someTransientStringimamightlyfinestring 。 我有一些像记住以下SQL:

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

我当然知道,我可以简单地重复所产生的收集和手动设置的属性,但我不知道是否有一种方法来JPA2内做到这一点。

谢谢 :)

Answer 1:

不,你不能做到这一点查询。

如果你能查询之外someTransientString找出价值,你可以使用负荷后回调(从JPA 2.0规范节选):

该实体已被加载到从数据库或后刷新操作当前的持久性上下文之后已经被应用到被调用用于实体的负荷后方法。 返回前一查询结果或访问或关联被遍历前负荷后方法被调用。

只需添加以下到您的实体:

@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";
}


Answer 2:

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

你可以看到,这是使用,例如战略,的EclipseLink(阅读下面的链接最后的评论):

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



文章来源: Initializing a transient attribute of a JPA entity during CriteriaQuery