【问题标题】:Is there any way to map MySql TIMESTAMP to java.lang.Long?有没有办法将 MySql TIMESTAMP 映射到 java.lang.Long?
【发布时间】: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.Datejava.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 中的等效类型是 InstantOffsetDateTime。 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


【解决方案1】:

一个属性在你声明它之前不会知道它的转换器。按如下方式进行:

@NotNull
@Convert (converter = DateConverter.class)
private Long dateCreated;

另外,改变转换器如下:

public class DateConverter implements AttributeConverter<Date, Long> {

    @Override
    public Date convertToDatabaseColumn(Long millis) {
        retrun new Date(millis);
    }

    @Override
    public Long convertToEntityAttribute(Date date) {
        return date.getTime();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多