Hibernate预期时间戳数据库的日期列

时间:2020-01-04 03:57:40

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

我正在使用投影将列的子集检索到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 [cause = org.hibernate.PropertyNotFoundException:类:QuestionPreviewDto中没有合适的构造函数

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

3 个答案:

答案 0 :(得分:0)

在DTO内,您只能将Date与Temporal一起用作时间戳,如下所示:

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

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

这不会更改时间戳的格式,并且我的 Entity 类仍可以使用Timestamp类型,如下所示:

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

因此,显然只有DTO投影才需要此解决方法。