SpringBoot测试中HSQLDB插入ZonedDateTime报无效日期格式异常求助
问题描述
在运行SpringBoot项目测试时,通过@Sql({"mysqlfile.sql"})指定测试前执行的SQL文件,其中插入语句包含:
insert into tableA( id, ..., changetime,...) values ('cdc1360e-390f-442b-9e61-c5659d3a56b4',...,'2022-01-01T15:00:00Z',...),
实体类对应属性为:
ZonedDateTime changetime,
测试使用HSQLDB数据库,执行时抛出异常:
Caused by: org.hsqldb.HsqlException: data exception: invalid datetime format
解决方法
- 调整SQL时间格式为HSQLDB兼容格式
HSQLDB对带时区的时间字符串解析规则与MySQL不同,将原SQL中的'2022-01-01T15:00:00Z'替换为'2022-01-01T15:00:00+00:00'(标准带偏移的ISO格式),或者'2022-01-01 15:00:00 UTC',HSQLDB就能正确解析。修改后的示例:
insert into tableA( id, ..., changetime,...) values ('cdc1360e-390f-442b-9e61-c5659d3a56b4',...,'2022-01-01T15:00:00+00:00',...),
- 配置HSQLDB启用格式兼容
在测试环境的数据源URL中添加日期格式参数和MySQL语法兼容开关,让HSQLDB识别原有的时间格式。在application-test.properties中配置:
spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true;datetime_format='yyyy-MM-dd''T''HH:mm:ss''Z'''
sql.syntax_mys=true开启MySQL语法兼容,datetime_format指定解析时间时使用的格式模板。
确认数据库字段类型匹配
检查tableA的changetime字段类型是否为TIMESTAMP WITH TIME ZONE,如果是普通TIMESTAMP类型,HSQLDB无法处理带时区的时间值,需要将字段类型修改为TIMESTAMP WITH TIME ZONE。脚本预处理转换时间(可选)
如果不想修改原始SQL文件,可以自定义SQL执行监听器,在脚本执行前将Z结尾的时间字符串替换为HSQLDB支持的格式。比如实现SqlScriptExecutionListener接口,在beforeScriptExecution阶段处理SQL内容。
内容的提问来源于stack exchange,提问作者user13904118
相关产品推荐
相关产品推荐

