如何用JPA保存SQL DateTime以解决‘字符串与日期时间转换失败’错误?
解决JPA save方法存储SQL datetime时的转换错误
我之前也碰到过一模一样的SQL Server日期转换问题,结合你的代码和报错信息,给你几个可行的解决方案:
1. 先修正代码中的笔误(避免编译级问题)
你的Controller层代码里有个明显的错误:
// 错误:用类名调用实例方法 Record.setCreateDatetime(ts); // 正确:应该用实例对象调用 record.setCreateDatetime(ts);
虽然这个不是导致日期转换错误的直接原因,但先修正它能避免后续不必要的问题。
2. 匹配数据库列类型与JPA字段映射
SQL Server的datetime和datetime2类型在JDBC映射上有细微差别,如果你数据库里的createDatetime列是datetime类型,建议在Entity的注解里明确指定列定义:
private Timestamp createDatetime; @Column(name = "createDatetime", columnDefinition = "datetime") public Timestamp getCreateDatetime() { return createDatetime; }
如果是datetime2类型,就把columnDefinition改成datetime2即可。
3. 改用Java 8+日期API(更推荐的方案)
JPA对Java 8引入的LocalDateTime支持更友好,能彻底避免Timestamp带来的时区和转换兼容性问题,修改Entity如下:
import java.time.LocalDateTime; private LocalDateTime createDatetime; @Column(name = "createDatetime") public LocalDateTime getCreateDatetime() { return createDatetime; } public void setCreateDatetime(LocalDateTime createDatetime) { this.createDatetime = createDatetime; }
同时Controller里也改成用LocalDateTime生成当前时间:
import java.time.LocalDateTime; @PostMapping("/record") public String updateRecord(@RequestParam("createDatetime") Timestamp createDatetime) { LocalDateTime now = LocalDateTime.now(); Record record = new Record(); record.setCreateDatetime(now); recordService.save(record); return "success"; // 记得返回合法响应 }
4. 升级SQL Server JDBC驱动版本
旧版本的mssql-jdbc驱动对Timestamp到SQL datetime的转换存在兼容性bug,建议把驱动升级到最新稳定版(比如12.4.2.jre8及以上),以Maven依赖为例:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.2.jre8</version> </dependency>
5. 若需使用前端参数,统一日期格式解析规则
如果之后需要用到前端传入的createDatetime参数,要确保前端传的日期格式符合JDBC解析要求(比如yyyy-MM-dd HH:mm:ss),也可以在Controller里用注解强制指定格式:
@PostMapping("/record") public String updateRecord( @RequestParam("createDatetime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Timestamp createDatetime ) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Stephen Chu
相关产品推荐
相关产品推荐

