Spring Boot Data JPA如何传入0303格式日期(日-月)?
解决Spring Boot Data JPA中
ddMM格式日期的插入问题 看起来你遇到的问题是Spring Boot Data JPA无法解析ddMM格式(日在前、月在后,比如0303代表3日3月)的日期字符串并持久化到数据库。别担心,我给你两种可行的解决方案,根据你的技术栈和业务需求选择就行:
方案一:使用Java 8+ LocalDate(推荐)
Java 8引入的日期时间API(java.time.LocalDate)比旧的java.util.Date更简洁、安全,结合Spring的@DateTimeFormat注解就能轻松处理自定义格式:
修改实体类
@Entity @Table(name = "execution") public class Execution implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "execution_id") private Integer executionGroupId; // 用LocalDate替代Date,指定ddMM格式的解析规则 @Column(name = "ExecutionDate") @DateTimeFormat(pattern = "ddMM") private LocalDate executionDate; // 生成Getter和Setter }
补充说明
@DateTimeFormat(pattern = "ddMM")会告诉Spring在绑定请求参数(比如REST接口、表单提交)时,自动把0303这样的字符串解析成LocalDate对象(年份默认取当前系统年)。- 如果业务需要指定固定年份,你可以在Service层手动补充,比如:
// 假设输入的日期字符串是"0303",指定年份为2024 String inputDateStr = "0303"; LocalDate date = LocalDate.of(2024, Integer.parseInt(inputDateStr.substring(2)), Integer.parseInt(inputDateStr.substring(0,2))); execution.setExecutionDate(date); - 数据库的
ExecutionDate字段建议用DATE类型,和LocalDate完美匹配。
方案二:基于旧Date类自定义转换器
如果你坚持使用java.util.Date,可以通过JPA的AttributeConverter自定义日期转换逻辑:
1. 创建自定义转换器
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.time.Year; @Converter(autoApply = true) // 自动应用到所有匹配的字段 public class DdMmDateConverter implements AttributeConverter<String, Date> { private static final SimpleDateFormat FULL_DATE_FORMAT = new SimpleDateFormat("ddMMyyyy"); // 默认使用当前年份,可根据业务调整 private final int defaultYear = Year.now().getValue(); @Override public Date convertToDatabaseColumn(String ddMmStr) { if (ddMmStr == null || ddMmStr.length() != 4) { return null; } try { // 拼接年份,转成完整的日期字符串 String fullDateStr = ddMmStr + defaultYear; return FULL_DATE_FORMAT.parse(fullDateStr); } catch (ParseException e) { throw new IllegalArgumentException("无效的日期格式:" + ddMmStr + ",请传入ddMM格式(如0303)", e); } } @Override public String convertToEntityAttribute(Date date) { if (date == null) { return null; } SimpleDateFormat ddMmFormat = new SimpleDateFormat("ddMM"); return ddMmFormat.format(date); } }
2. 修改实体类字段
@Entity @Table(name = "execution") public class Execution implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "execution_id") private Integer executionGroupId; @Column(name = "ExecutionDate") @Convert(converter = DdMmDateConverter.class) // 指定转换器 private Date executionDate; // 生成Getter和Setter }
注意事项
- 转换器会自动将
ddMM格式的字符串转成Date存入数据库,同时从数据库读取时转回ddMM字符串。 - 如果需要动态指定年份,可以修改转换器逻辑,比如从其他业务参数获取年份。
额外检查点
- 确认数据库的
ExecutionDate字段类型是DATE或TIMESTAMP,和实体类字段类型匹配。 - 如果是通过REST接口传入参数,确保请求参数的格式严格为
ddMM(比如0303,不要加分隔符)。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

