我正在为Spring Boot应用程序编写集成测试。该应用程序对SQL Server数据库使用Spring Data JPA,我的测试在SQL Server模式下使用内存中的H2数据库。
SQL Server数据库中有许多datetimeoffset(7)
列,JPA实体中有相应的Instant
个字段。以下AttributeConverter
处理转换:
@Converter(autoApply = true)
public class InstantToStringConverter implements AttributeConverter<Instant, String> {
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnn xxx");
@Override
public String convertToDatabaseColumn(Instant entityValue) {
return entityValue !=null ? entityValue.toString(): null;
}
@Override
public Instant convertToEntityAttribute(String value) {
ZonedDateTime zonedDateTime = ZonedDateTime.parse(value, formatter);
Instant result = Instant.from(zonedDateTime);
return value != null ? result : null;
}
}
这适用于SQL Server,因为datetimeoffset
匹配该模式(例如2017-04-25 14:05:19.3600000 +00:00)。但是,对于H2,由于时间戳格式不同,从String
到Instant
的转换失败:
java.time.format.DateTimeParseException: Text '2018-06-13T19:53:55.903Z' could not be parsed at index 10
我让H2为我生成架构,将这些列创建为NVARCHAR
,但我也尝试使用H2的TIMESTAMP
和TIMESTAMP WITH TIMEZONE
类型手动创建表格。这些格式都不起作用。
改变实体或转换器不在我的范围内,所以我希望有一个特定于H2的解决方案。我可以强制H2使用我需要的时间戳格式,或者可能在我的测试中拦截转换/映射过程吗?我目前的解决方法是编写本机查询并调用H2的FORMATDATETIME(CreateTimestamp, 'yyyy-MM-dd HH:mm:ss.SSSSSSS XXX')
函数,但我更愿意使用Spring存储库。