【发布时间】:2021-03-18 20:00:26
【问题描述】:
所以我将这个对象保存到数据库中,其中一个属性是dateCreated,当然,它保存为 MySQL 时间戳。但是在将数据发送到客户端时,我希望以毫秒为单位。现在,我已将其映射到 Date 对象,并将其进一步转换为毫秒。但我想,如果我可以映射我的 POJO,它可以在毫秒内检索值。这是我尝试过的。
OmsJob:
@Entity
@EntityListeners(PreventAnyUpdate.class)
@ConfigurationProperties("omsjob")
@Table(name = "OMSJob")
public class OmsJob {
@Id
@NotNull
@Column(name = "jobId")
private String id;
@NotNull
private Long dateCreated; // If I map this property to Date, it works fine
}
我想我会添加一个自定义转换器,它将java.util.Date 或java.sql.Date 转换为毫秒。但它不起作用:
@Component
@ConfigurationPropertiesBinding
public class DateConverter implements Converter<Date, Long> {
@Override
public Long convert(Date date) {
return date.getTime();
}
}
我得到的错误很明显,但是有什么方法可以实现我想要的吗?
ERROR 229770 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Unsupported conversion from TIMESTAMP to java.lang.Long
【问题讨论】:
-
您为什么要这样做?您应该将其映射到
java.time.LocalDateTime- 您如何将该数据发送到客户端与您的 Java 代码中的表示无关。 -
@a_horse_with_no_name 不,不是
LocalDateTime。 MySQL 中的TIMESTAMP类型类似于 SQL 标准类型TIMESTAMP WITH TIME ZONE,其框架中的 offset-from-UTC 为零。因此,Java 中的等效类型是Instant或OffsetDateTime。 JDBC 4.2 规范要求所有 JDBC 驱动程序支持OffsetDateTime,但不支持Instant(奇怪)。 -
@BasilBourque:谢谢,我不知道。根据 SQL 标准,
timestamp等同于timestamp without time zone- 但是假设 MySQL 一开始就关心它可能是愚蠢的。 -
请注意您的方法涉及数据丢失。
TIMESTAMP类型解析为微秒,比您计划的毫秒更精细。 -
@a_horse_with_no_name 不,不是 SQL 标准。我是说 MySQL 定义其
TIMESTAMP值,其与 UTC 的偏移量为零时分秒。这使得 MySQL 类型类似于 SQL 标准的类型TIMESTAMP WITH TIME ZONE。 SQL 标准不涉及任何实现,例如 MySQL。
标签: java mysql jpa spring-data-jpa spring-data