使用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; }