如何去除@CreationTimestamp注解生成时间的分钟部分,仅保留年月日?
解决@CreationTimestamp仅保留年月日的问题
这里提供几种实用方案,根据你的需求选择:
方案1:改用LocalDate类型+数据库DATE列
直接将字段类型从Date改为LocalDate(仅存储年月日的Java类型),同时指定数据库列类型为DATE,Hibernate的@CreationTimestamp会自动生成当前日期,不带时间部分:
@Data @Entity @Table(name = "exchange_rates") public class ExchangeRate { // 其他字段... @CreationTimestamp @Column(name = "downloaddate", columnDefinition = "DATE") private LocalDate downloaddate; }
方案2:使用AttributeConverter转换日期
如果不想修改字段类型,仍保留Date,可以通过转换器截断时间部分:
首先定义转换器类:
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.sql.Date; import java.time.LocalDate; import java.time.ZoneId; @Converter(autoApply = true) public class DateToLocalDateConverter implements AttributeConverter<java.util.Date, Date> { @Override public Date convertToDatabaseColumn(java.util.Date attribute) { if (attribute == null) { return null; } LocalDate localDate = attribute.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); return Date.valueOf(localDate); } @Override public java.util.Date convertToEntityAttribute(Date dbData) { if (dbData == null) { return null; } return new java.util.Date(dbData.getTime()); } }
然后在字段上应用转换器:
@Data @Entity @Table(name = "exchange_rates") public class ExchangeRate { // 其他字段... @CreationTimestamp @Column(name = "downloaddate") @Convert(converter = DateToLocalDateConverter.class) private Date downloaddate; }
方案3:用@PrePersist手动设置日期
去掉@CreationTimestamp,通过@PrePersist注解在持久化前手动生成仅含年月日的日期(时间部分为00:00:00):
@Data @Entity @Table(name = "exchange_rates") public class ExchangeRate { // 其他字段... @Column(name = "downloaddate") private Date downloaddate; @PrePersist public void setDownloadDate() { if (this.downloaddate == null) { LocalDate today = LocalDate.now(); this.downloaddate = java.util.Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant()); } } }
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

