在我的数据模型中,我有一个具有两个数字属性的实体,映射到具有适当列的表,以及一个附加属性,例如:
@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吗?或者根本没有?
谢谢。
答案 0 :(得分:1)
您不能在查询中使用Java计算属性:查询被转换为SQL并由数据库执行,而数据库不了解和关心您的Java代码。
您可以向实体添加其他持久字段,并使用Formula进行批注。但要小心:修改sideA然后获取该区域将返回旧区域,这是由数据库在从数据库中读取实体时计算的。此外,Formula是特定于Hibernate的。 JPA不支持它。
答案 1 :(得分:0)
您可以使用@Transient
注释该属性。但请记住,您的hql查询中不再提供该属性。
使用@Forumlar
,您可以使用查询中的属性。