如何声明和使用未传输到数据库或从数据库传输的属性

时间:2016-03-05 23:20:56

标签: java hibernate jpa orm persistence

在我的数据模型中,我有一个具有两个数字属性的实体,映射到具有适当列的表,以及一个附加属性,例如:

@Entity
@Table(name="rectangles")
public class Rectangle {

    private int sideA;
    private int sideB;

    @Basic public int getSideA() { return sideA; }
    @Basic public int getSideB() { return sideB; }

    //What annotations should I use here?
    public int getArea() { return sideA * sideB; }

    //...corresponding setters for sideA and sideB
    ...
}

现在,我的问题是:我可以(如何?)标记属性Area,以便仍然按应用程序计算(其getter),在数据库中没有相应的列,但可以在查询,条件构建器API等中使用(由名称引用)?如果我将其标记为@Transient,则无法在查询中使用它。如果我以任何其他方式对其进行注释,我需要将其映射到某个列。我错过了什么?可以通过常规JPA来完成吗?有了Hibernate吗?或者根本没有?

谢谢。

2 个答案:

答案 0 :(得分:1)

您不能在查询中使用Java计算属性:查询被转换为SQL并由数据库执行,而数据库不了解和关心您的Java代码。

您可以向实体添加其他持久字段,并使用Formula进行批注。但要小心:修改sideA然后获取该区域将返回旧区域,这是由数据库在从数据库中读取实体时计算的。此外,Formula是特定于Hibernate的。 JPA不支持它。

答案 1 :(得分:0)

您可以使用@Transient注释该属性。但请记住,您的hql查询中不再提供该属性。

使用@Forumlar,您可以使用查询中的属性。