使用Spring Data JPA如何实现仅持久化时间和星期几数据?
实现方案
1. 数据库层设计
MySQL端直接使用原生字段类型匹配需求,不需要额外做格式转换:
startTime字段选用TIME类型,原生支持HH:mm:ss格式的时间存储,无冗余日期数据startDay字段可选VARCHAR(10)或枚举类型ENUM('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),使用枚举可额外增加数据合法性校验
建表参考SQL:
CREATE TABLE your_business_table ( -- 主键及其他业务字段省略 startTime TIME NOT NULL COMMENT '时间(格式HH:mm:ss)', startDay ENUM('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') NOT NULL COMMENT '星期几' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. JPA实体类映射配置
依托Java 8的java.time时间API和JPA的转换能力,无需自定义复杂处理逻辑即可实现映射:
基础映射(直接用字符串存星期)
import javax.persistence.*; import java.time.LocalTime; @Entity @Table(name = "your_business_table") public class BusinessEntity { // 主键及其他字段、getter/setter省略 // LocalTime默认会自动映射到MySQL的TIME类型,持久化后就是HH:mm:ss格式 private LocalTime startTime; // 直接用String接收存储星期字符串即可 private String startDay; }
规范映射(用枚举存星期避免非法值)
如果希望在代码层面避免传入非法的星期值,可使用java.time.DayOfWeek枚举,配合自定义JPA转换器实现自动映射:
首先定义转换器:
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.time.DayOfWeek; @Converter(autoApply = false) public class DayOfWeekConverter implements AttributeConverter<DayOfWeek, String> { @Override public String convertToDatabaseColumn(DayOfWeek dayOfWeek) { if (dayOfWeek == null) return null; // 转换为首字母大写的英文全称,如MONDAY -> Monday return dayOfWeek.name().charAt(0) + dayOfWeek.name().substring(1).toLowerCase(); } @Override public DayOfWeek convertToEntityAttribute(String dbValue) { if (dbValue == null || dbValue.isBlank()) return null; return DayOfWeek.valueOf(dbValue.toUpperCase()); } }
然后在实体类中引用转换器:
import javax.persistence.*; import java.time.LocalTime; import java.time.DayOfWeek; @Entity @Table(name = "your_business_table") public class BusinessEntity { private LocalTime startTime; @Convert(converter = DayOfWeekConverter.class) private DayOfWeek startDay; }
3. 接入注意事项
- 接口层接收前端传入的HH:mm:ss格式字符串时,在对应的字段上添加
@DateTimeFormat(pattern = "HH:mm:ss")即可自动转换为LocalTime类型 - Spring Boot 2.x及以上版本默认已集成
java.time类型的JPA映射和JSON序列化能力,无需额外引入依赖
内容的提问来源于stack exchange,提问作者Cork Kochi
相关产品推荐
相关产品推荐

