【问题标题】:Mapping TIMESTAMP column from PostgreSQL to LocalDate将 TIMESTAMP 列从 PostgreSQL 映射到 LocalDate
【发布时间】:2019-04-02 03:01:09
【问题描述】:

我在实体中有字段:

@Column(name = "BILL_DATE")
private LocalDate billDate;

我的系统可以使用oracleposthresql。在 posgresql 中,此列的类型为 timestamp,但在 oracle 中为 date。当我尝试使用postgeSQL 启动服务器时出现错误:

wrong column type encountered in column [bill_date] in table [charges]; found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]

如果我添加注释 @Temporal(TemporalType.DATE) 我会得到另一个错误:

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property

但我不想使用java.util.Datejava.util.Calendar如何解决这个问题?

【问题讨论】:

  • 哪个休眠版本?
  • @Jerry06 [org.hibernate.Version] [] HHH000412: Hibernate Core {5.2.17.Final}
  • 应该可以,可能是你的休眠配置有问题
  • 龙呢?它将包装 Date 和 TimeStamp 类型,但您将获得格式为 epoch 时间戳:1540802067000

标签: java hibernate timestamp localdate


【解决方案1】:

Date in OracleTimestamp in PostgreSQL 都存储日期时间。实际上,根据PostgreSQL Documentation,如果时间戳不带时区,您应该将它们映射到LocalDateTime,或者如果带有时区,则映射到OffsetDateTime

Hibernate 5 应该支持 Java8 Time API,无论如何如果你使用 JPA,你可以实现 AttributeConverter

import javax.persistence.AttributeConverter;
import java.sql.Timestamp;
import java.time.LocalDate;

public class LocalDateConverter implements AttributeConverter < LocalDate, Timestamp > {

    @Override
    public Timestamp convertToDatabaseColumn(LocalDate attribute) {
        return attribute != null ? Timestamp.valueOf(attribute.atStartOfDay()) : null;
    }

    @Override
    public LocalDate convertToEntityAttribute(Timestamp dbData) {
        return dbData != null ? dbData.toLocalDateTime().toLocalDate() : null;
    }

}

然后就可以使用了

@Convert(converter = LocalDateConverter.class)
@Column(name = "BILL_DATE")
private LocalDate billDate;

【讨论】:

  • 我可以在没有转换器的情况下使用LocalDateTime 。这是工作。我需要将日期存储为时间戳列中的日期
  • @ip696 “时间戳类型的有效输入由日期和时间的串联组成”,因此时间戳列也将始终具有 hh:mm:ss。如果您必须使用 LocalDate,您可以尝试使用转换器。当然,如果您使用 LocalDateTime ,您可以轻松地将其转换为 LocalDate
猜你喜欢
  • 2017-03-23
  • 2016-10-13
  • 2020-05-09
  • 1970-01-01
  • 2012-07-16
  • 2019-11-01
  • 2021-02-06
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多