2011-11-28 16 views
1

我很確定這個問題在任何地方都被問過 - 沒有找到答案。Entityinstance + Extrafield列表的條件

我有一個簡單的標準是這樣的:

s.createCriteria(Human.class).list() 

給我人類的entityinstance(性別和名字)的resultlist。

我可以添加一個像「salutation」這樣的計算結果到僅得到的實體實例嗎(不更改Human.java)並避免創建二維數組?

我知道,這應該是這樣的裝飾類的工作,有沒有什麼解決方法?擴大的entityinstance應該擴展人類!

+0

這可能與Hibernate ['SQLQuery'](http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/SQLQuery.html) - 尋找'addEntity()'和'addScalar ()'。 – xmedeko

回答

2

不,這不是完全可能的。 Criteria查詢只能返回由標量構建的實體,標量數組或值對象(使用ResultTransformer)。

您可以返回一個HumanWithSalutation對象列表,它將與Human +附加稱呼對象保持相同的字段,但這些對象將是值對象,而不是持久對象:不會對這些對象進行任何修改對數據庫持久保存,就像人類實例一樣。

要做到這一點,創建類:

public class HumanWithSalutation extends Human { 
    private String salutation; 

    // getter and setter 
} 

分配一個AliasToBeanResultTransformer(這將填充使用制定者所有HumanWithSalutation對象),並確保標準有一個投影列表返回人類的所有領域+稱呼(化名爲「稱呼」):

ProjectionList projectionList = Projections.projectionList(); 
projectionList.add(Projections.property("id"); 
projectionList.add(Projections.property("name"); 
projectionList.add(Projections.property("gender"); 
projectionList.add(Projections.alias(Projections.sqlProjection(...), "salutation")); 
criteria.setProjection(projectionList); 

如果您不希望SQL投影,你可以實現在getSalutation()方法的Java改造(和刪除的setter)。

0

如果您對@Formula渴望提取,您可以添加@Formula映射到Human類的屬性。

或者,如果你需要這個屬性被延遲加載,然後就在同一個表一個額外的實體Human

@Entity 
@Table("HUMAN") 
@Immutable 
public class HumanWithSalutation extends Human { 
    @Id 
    private Long id; 
    @Formula("(select ...)") 
    private String salutation; 

    // getter and setter 
} 

,然後從Human通過@OneToOne(fetch = FetchType.LAZY)@PrimaryKeyJoinColumn映射。