在我的数据模型中,我有一个具有两个数值属性的实体,映射到一个具有适当列的表,另外还有一个属性,例如:
@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做吗?冬眠?还是一点也不?
谢谢。
发布于 2016-03-06 09:56:32
您不能在查询中使用Java计算的属性:查询被转换为SQL并由数据库执行,数据库不知道也不关心Java代码。
可以向实体中添加一个附加的持久化字段,并使用公式进行注释。但是要小心:修改sideA,然后获取该区域将返回旧的区域,在从数据库读取实体时由数据库计算。另外,公式是Hibernate特有的.JPA不支持。
发布于 2016-03-06 10:27:13
您可以用@Transient注释该属性。但是请记住,在您的hql查询中,该属性不再可用。
使用@Forumlar,您可以使用查询中的属性。
https://stackoverflow.com/questions/35821135
复制相似问题