JPA 从其他字段计算字段

JPA calculated field from other fields

我正在开发一个系统,我需要根据同一实体中的其他属性计算点数,即:

@Column(name = "distance")
private Integer distance;
@Column(name = "speed")
private Integer speed;
@Column(name = "calories")
private Integer calories ??

我需要根据速度和距离计算卡路里并保存这个值..

您不需要保留它们 - 因为您可以随时获取 sum 的值。你为什么要拯救它? @瞬态

public Integer getSum(){
return (distance + speed) * calories 
}

使用@Transient可以不在DB中保存这个值。

创建一个新方法,例如 updateCalories()距离速度[计算当前 卡路里 =18=]。每当 distance, speed 或其他相关字段发生变化(setters, constructor)时调用此方法或使用实体侦听器在实体是时自动调用该方法created/updated(@PreUpdate、@PrePersist...)

我有两种选择

选项 1:@Formular

@Formula("speed * distance")
private int calories;

卡路里在数据库中没有自己的列,但您可以通过 getter 访问它们。每次从数据库中获取实体时都会计算卡路里(值在内存中)。 @Formula 的一个优点是你可以在那里写一个完整的命名查询,它可能引用不同的 table 值

选项 2:@PreUpdate and/or @PrePersist

private int calories;

@PreUpdate
@PrePersist
public void calc() {
    calories = speed * distance;
}

在此选项中,卡路里在数据库中有其自己的列! 如果您使用 EntityManager

坚持一个实体,它已经计算并坚持