2012-04-25 63 views
11

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

@Entity 
public SampleEntity{ 

    @Id 
    private long id; 

    [more attributes] 

    @Transient 
    private String someTransientString; 

    [getters and setters] 
} 

现在我想撰写一个加载SampleEntity个CriteriaQuery中,并自动设置someTransientStringimamightlyfinestring。我心里有类似如下的SQL:

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

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

谢谢:)

回答

11

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

如果可以为someTransientString查询之外找出值,则可以使用PostLoad回调(摘自JPA 2.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"; 
} 
+0

谢谢,我想尽可能多。 – ftr 2012-04-26 07:28:13