我有一个场景,我有 2 个标签需要配置。标签的名称是“Out Date”和“In Date”。我在数据库中只有一个名为“日期”的字段。它是“Out”还是“In”在运行时由枚举“Scenario”的值决定。但是,我需要实际向用户显示 Out Date&In Date,以便他可以选择 1 个或两个。我听说 JPA 将协助计算字段概念。这是真的还是有其他方法可以实现这一目标。下面是一些示例代码。
日期
@Override
@Convert("DateTimeConverter")
@Column(name = "DATE")
public DateTime getDate() {
return date;
}
场景
@Override
@Convert("EnumConverter")
@Column(name = "SCENARIO")
public Scenario getScenario() {
return scenario;
}
场景是任何具有值 OUT(1),IN(2) 的枚举
最佳答案
JPA 中没有计算属性。
您可以使用@Transient
注解来创建不持久化但根据其他字段计算的属性:
@Transient
public DateTime getInDate() {
if (scenario == Scenario.IN) {
return date;
}
return null;
}
@Transient
public DateTime getOutDate() {
if (scenario == Scenario.OUT) {
return date;
}
return null;
}
或者,如果您使用的是 Hibernate,则可以使用专有注释 @Formula
:
@Formula("case when SCENARIO = 2 then DATE else NULL end")
@Convert("DateTimeConverter")
private DateTime inDate;
@Formula("case when SCENARIO = 1 then DATE else NULL end")
@Convert("DateTimeConverter")
private DateTime outDate;
我更喜欢第一个选项,因为:
- 使用单元测试更容易测试
- 在单元测试中更容易使用实体
- 它不需要专有扩展
- 通常 SQL 的可移植性可能存在一些问题,尽管在这个问题中
case when
是 SQL 92 兼容的,因此它在这里不适用
我能解决的唯一问题是,最简单的方法是我们通过向客户端公开实体的内部结构(scenario
和 date
属性)来放弃封装。但是您始终可以使用访问器 protected
隐藏这些属性,JPA 仍会处理它。
关于java - 计算属性 wrt JPA。这对我有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397781/