我正在使用投影将列的子集检索到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
吗?
答案 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(或等效值)的类型映射。
答案 2 :(得分:0)
我的使用休眠的quarkus应用程序遇到了同样的问题。 我通过将 DTO 中的字段更改为Date并进行了如下注释来解决该问题:
@Type(type="timestamp")
private Date datePosted;
这不会更改时间戳的格式,并且我的 Entity 类仍可以使用Timestamp类型,如下所示:
@Type(type="timestamp")
private Timestamp datePosted;
因此,显然只有DTO投影才需要此解决方法。