【问题标题】:Hibernate expecting Date for Timestamp database column休眠期望时间戳数据库列的日期
【发布时间】:2020-01-04 03:57:40
【问题描述】:

我正在使用投影将列的子集检索到 DTO 中。下面是 DTO

QuestionPreviewDto.java

private Long id;
private String question;
private Timestamp datePosted;

public QuestionPreviewDto(Long id, String question, Timestamp datePosted){
    this.id = id;
    this.question = question;
    this.datePosted = datePosted;
}

数据库表

CREATE TABLE question
(
    id               BIGINT NOT NULL,
    question         varchar(250) NOT NULL,
    date_posted      TIMESTAMP,
    .....
 )

下面是填充 DTO 的存储库方法,其中 QuestionEntity 是映射到数据库表 question 的实体类。

@Query("select new QuestionPreviewDto(id, question, datePosted) from QuestionEntity where id = :id")
QuestionPreviewDto getQuestionPreview(@Param("id") Long id);

上面的查询给了我以下错误

无法在类 [QuestionPreviewDto] 上找到适当的构造函数。预期的参数是:long、java.lang.String、java.util.Date [原因=org.hibernate.PropertyNotFoundException:类中没有合适的构造函数:QuestionPreviewDto]

datePosted 的类型在数据库和Java 类中为Timestamp 时,不确定为什么Hibernate 期待java.util.Date

【问题讨论】:

  • 仅供参考,Java 中的 DateTimestamp 类现在都已过时,取而代之的是 JSR 310 中定义的现代 java.time 类。Hibernate 和 JPA 2.2两者都支持java.time。对于类似于 SQL 标准 TIMESTAMP WITH TIME ZONE 类型的数据库列,您应该使用 java.time.OffsetDateTime 而不是 Timestamp
  • 为什么不用DateLocalDateTime 而不是TimeStamp
  • @ShekharRai 但它仍然需要 util.Date。
  • 您确定您对private java.util.Date datePosted; 进行了更改吗?

标签: java spring hibernate date spring-data-jpa


【解决方案1】:

在 DTO 中,您只能使用 Date 和 Temporal 作为时间戳,如下所示

@Temporal(TemporalType.TIMESTAMP)
private java.util.Date utilTimestamp;

当您将它保存在 DTO 中的 Date 中时,它会自动转换为时间戳,它是 DB 中的时间戳。

【讨论】:

  • 嗯,这可以使用util.Date,但似乎不是正确的方法。
【解决方案2】:

确保您的QuestionEntity 根据 O\R 映射文档正确映射:

日期、时间、时间戳 从 java.util.Date 及其子类到 SQL 类型 DATE、TIME 和 TIMESTAMP(或等效)的类型映射。

日历,日历日期 从 java.util.Calendar 到 SQL 类型 TIMESTAMP 和 DATE(或等效)的类型映射。

https://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-types-entitiesvalues

【讨论】:

    【解决方案3】:

    我的 quarkus 应用程序使用休眠时遇到了同样的问题。 我通过将 DTO 中的字段更改为 Date 并像这样注释它来解决它:

    @Type(type="timestamp")
    private Date datePosted;
    

    这并没有改变时间戳的格式,我的 Entity 类仍然可以像这样使用 Timestamp 类型:

    @Type(type="timestamp")
    private Timestamp datePosted;
    

    因此,显然这种解决方法仅适用于 DTO 投影。

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 2020-05-15
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      相关资源
      最近更新 更多