gpt4 book ai didi

java - 计算属性 wrt JPA。这对我有用吗?

转载 作者:行者123 更新时间:2023-11-29 04:54:04 28 4
gpt4 key购买 nike

我有一个场景,我有 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 兼容的,因此它在这里不适用

我能解决的唯一问题是,最简单的方法是我们通过向客户端公开实体的内部结构(scenariodate 属性)来放弃封装。但是您始终可以使用访问器 protected 隐藏这些属性,JPA 仍会处理它。

关于java - 计算属性 wrt JPA。这对我有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397781/

28 4 0
文章推荐: java - SomeClass 什么时候合适/有用