如何在JPA实体(如User)中存储时分,忽略秒和毫秒?
实现Date类型仅存储时分信息的方案
原代码里的@Temporal(TemporalType.DATE)是用来存年月日的,完全不符合你要存时分的需求,得先改注解,再处理掉秒和毫秒的信息,下面给你两种可行的实现方式:
方案一:手动截断+调整JPA注解
- 把
@Temporal的类型改成TemporalType.TIME,这个类型对应数据库的时间类型(比如MySQL的TIME),用来存时分秒。 - 在设置字段值的时候,手动把秒和毫秒清零,确保只保留时分信息。
修改后的实体代码:
import jakarta.persistence.Basic; import jakarta.persistence.Temporal; import jakarta.persistence.TemporalType; import java.util.Calendar; import java.util.Date; class User { @Basic @Temporal(TemporalType.TIME) private Date birthTime; // 建议把变量名改成birthTime,更贴合存时分的语义 // 设置方法里截断秒和毫秒 public void setBirthTime(Date birthTime) { if (birthTime == null) { this.birthTime = null; return; } Calendar cal = Calendar.getInstance(); cal.setTime(birthTime); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); this.birthTime = cal.getTime(); } // 其他getter和setter自行补充即可 }
方案二:用JPA属性转换器统一处理
如果你有多个字段需要做这种截断,可以写个转换器,让JPA自动帮你处理,不用每个字段都写重复代码。
- 先编写转换器类:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; import java.util.Calendar; import java.util.Date; @Converter(autoApply = true) // 设为true会自动应用到所有Date类型字段,不想全局生效就改为false public class TimeTruncatorConverter implements AttributeConverter<Date, Date> { @Override public Date convertToDatabaseColumn(Date attribute) { if (attribute == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(attribute); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } @Override public Date convertToEntityAttribute(Date dbData) { // 从数据库读取时无需额外处理,直接返回即可 return dbData; } }
- 若
autoApply设为false,在实体字段上指定转换器:
import jakarta.persistence.Basic; import jakarta.persistence.Temporal; import jakarta.persistence.TemporalType; import jakarta.persistence.Convert; class User { @Basic @Temporal(TemporalType.TIME) @Convert(converter = TimeTruncatorConverter.class) private Date birthTime; // getter和setter自行补充 }
额外建议
如果你的项目用的是Java 8及以上版本,直接用LocalTime会更省心,因为LocalTime本身就能只表示时分,不用手动处理秒和毫秒。JPA 2.2及以上版本原生支持这个类型:
import jakarta.persistence.Basic; import java.time.LocalTime; class User { @Basic private LocalTime birthTime; // 存储时直接用LocalTime.of(小时, 分钟),默认无秒和毫秒 // getter和setter自行补充 }
内容的提问来源于stack exchange,提问作者user352290
相关产品推荐
相关产品推荐

