Entityinstance + Extrafield列表的标准

时间:2011-11-28 11:40:49

标签: hibernate criteria hibernate-criteria

我很确定这个问题在任何地方都已被问过 - 没有找到答案。

我得到了一个简单的标准:

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

给我一​​个人类实体(性别和名称)的结果清单。

我是否可以仅向生成的实体实例添加“敬礼”等计算(不更改Human.java)并避免创建二维数组?

我知道,这应该是这样一个Decorator-Class的工作,有没有解决办法?扩大后的实体实体应该扩展到人类阶层!

2 个答案:

答案 0 :(得分:2)

不,这不是完全可能的。 Criteria查询只能返回实体,标量数组或从标量构建的值对象(使用ResultTransformer)。

您可以返回HumanWithSalutation个对象的列表,这些对象将包含与人类相同的字段+另外一个称呼对象,但这些对象将是值对象,而不是持久对象:对这些对象进行的任何修改都会不像人类实例那样对数据库保持持久性。

为此,请创建类:

public class HumanWithSalutation extends Human {
    private String salutation;

    // getter and setter
}

为其分配AliasToBeanResultTransformer(将使用setter填充所有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)。

答案 1 :(得分:0)

如果您对@Formula热切提取感到满意,可以将Human映射的属性添加到@Formula类中。

或者如果你需要懒惰地获取这个属性,那么在与Human

相同的表上创建一个额外的实体
@Entity
@Table("HUMAN")
@Immutable
public class HumanWithSalutation extends Human {
    @Id
    private Long id;
    @Formula("(select ...)")
    private String salutation;

    // getter and setter
}

然后将Human的{​​{1}}与@OneToOne(fetch = FetchType.LAZY)一起映射。