如何使用 JPA 和休眠映射计算属性

2022-08-31 08:36:32

我的 Java Bean 有一个 childCount 属性。此属性未映射到数据库列。相反,它应该由数据库计算,该数据库使用一个计数()函数操作我的Java Bean及其子级的连接。如果可以按需/“懒惰地”计算此属性,那就更好了,但这不是强制性的。

在最坏的情况下,我可以使用 HQL 或 Criteria API 设置此 Bean 的属性,但我宁愿不这样做。

Hibernate注释可能会有所帮助,但我几乎找不到任何文档。@Formula

任何帮助都非常感谢。谢谢。


答案 1

JPA 不提供对派生属性的任何支持,因此您必须使用特定于提供程序的扩展。正如你所提到的,在使用Hibernate时是完美的。您可以使用 SQL 片段:@Formula

@Formula("PRICE*1.155")
private float finalPrice;

甚至是对其他表的复杂查询:

@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)")
private Date firstOrderDate;

当前实体的位置。idid

以下博客文章值得一读:休眠派生属性 - 性能和可移植性

如果没有更多细节,我无法给出更准确的答案,但上面的链接应该会有所帮助。

另请参阅:


答案 2

您有三种选择:

  • 您正在使用方法计算属性@Transient
  • 您还可以使用实体侦听器@PostLoad
  • 或者您可以使用休眠特定的注释@Formula

虽然Hibernate允许您使用@Formula,但对于JPA,您可以使用@PostLoad回调来填充具有某些计算结果的瞬态属性:

@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;
}

因此,您可以像这样使用休眠:@Formula

@Formula("""
    round(
       (interestRate::numeric / 100) *
       cents *
       date_part('month', age(now(), createdOn)
    )
    / 12)
    / 100::numeric
    """)
private double interestDollars;

推荐