Spring Data JPA中@DeleteMapping用Timestamp参数无法删除数据库行问题
排查方向及核心问题
优先级最高的可直接验证的问题
- 方法名不匹配问题:Service接口定义的按日期删除方法名为
deleteAdvisorTimeoffByDate,但实现类中重写的方法名为deleteAdvisorTimeoffByDates(多了后缀s)。如果你的工程能正常启动无编译报错,说明接口中额外定义了带s的同名方法,Controller实际调用的是接口中未实现的空方法,自然不会执行删除逻辑。 - 请求参数逻辑错误:你示例请求中
datetimeStart=2021-12-25 13:00:00、datetimeEnd=2021-10-25 14:00:00,开始时间晚于结束时间,数据库中几乎不可能存在符合该时间范围的业务数据,自然无数据被删除。 - Timestamp参数绑定错误:Spring MVC默认没有配置全局日期格式化规则时,无法直接将
2021-12-25 13:00:00格式的字符串自动转换为Timestamp类型,你拿到的参数大概率是null或格式错误的时间,无法匹配数据库中的数据。
进一步排查步骤
- 开启JPA SQL打印:在配置文件中添加
spring.jpa.show-sql=true、spring.jpa.properties.hibernate.format_sql=true、logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace,观察控制台输出的DELETE语句及实际绑定的参数值,确认参数是否和请求传入的值一致。 - 校验时间时区一致性:确认数据库中存储的
DATETIME_START、DATETIME_END字段的时区和你请求传入的时间时区是否一致,比如数据库存的是UTC时间,你传的是东八区时间会相差8小时,无法匹配到对应数据。 - 给Timestamp参数添加格式化注解:在Controller的参数前添加
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解,强制指定日期转换格式,避免参数解析错误。示例:
protected PostResponse deleteAdvisorTimeoffByDate(@PathVariable Long advisor, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Timestamp datetimeStart, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Timestamp datetimeEnd)
- 检查复合主键的equals、hashCode实现:确保你实体类中注释的两个方法正确实现了三个主键字段的对比,避免JPA识别实体匹配错误。
内容的提问来源于stack exchange,提问作者AlgoTrading
相关产品推荐
相关产品推荐

