使用JPA / Hibernate计算属性
我的Java bean有一个childCount属性。 此属性未映射到数据库列 。 相反,它应该由数据库用在我的Java bean及其子节点上运行的COUNT()
函数进行计算 。 如果这个属性可以按需求/“懒惰地”计算,那就更好了,但这不是强制性的。
在最坏的情况下,我可以用HQL或Criteria API来设置这个bean的属性,但是我不想这样做。
Hibernate @Formula
注释可能有帮助,但我几乎找不到任何文档。
任何帮助不胜感激。 谢谢。
JPA不提供任何衍生财产的支持,所以你将不得不使用提供商的具体扩展。 正如你所提到的, @Formula
在使用Hibernate的时候是非常完美的。 你可以使用一个SQL片段:
@Formula("PRICE*1.155") private float finalPrice;
甚至在其他表上的复杂查询:
@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)") private Date firstOrderDate;
其中id
是当前实体的id
。
以下博客文章值得一读: Hibernate派生属性 – 性能和可移植性 。
没有更多的细节,我不能给出更准确的答案,但上面的链接应该是有帮助的。
也可以看看
- 第5.1.22节。 列和公式元素 (Hiberante核心文档)
- 第2.4.3.1节。 公式 (Hibernate注释文档)
正如本文所解释的那样,您有三个select:
- 要么使用
@Transient
方法计算属性 - 你也可以使用
@PostLoad
实体监听器 - 或者你可以使用Hibernate特定的
@Formula
注解
虽然Hibernate允许你使用@Formula和JPA,你可以使用@PostLoadcallback来填充瞬态属性,其计算结果如下:
@Column(name = "price") private Double price; @Column(name = "tax_percentage") private Double taxes; @Transient private Double priceWithTaxes; @PostLoad private void onLoad() { this.priceWithTaxes = price * taxes; }