You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JPA实体(如User)中存储时分,忽略秒和毫秒?

实现Date类型仅存储时分信息的方案

原代码里的@Temporal(TemporalType.DATE)是用来存年月日的,完全不符合你要存时分的需求,得先改注解,再处理掉秒和毫秒的信息,下面给你两种可行的实现方式:

方案一:手动截断+调整JPA注解

  1. 把@Temporal的类型改成TemporalType.TIME,这个类型对应数据库的时间类型(比如MySQL的TIME),用来存时分秒。
  2. 在设置字段值的时候,手动把秒和毫秒清零,确保只保留时分信息。

修改后的实体代码:

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自动帮你处理,不用每个字段都写重复代码。

  1. 先编写转换器类:
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;
    }
}
  1. 若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:42