使用SQL Server的datetimeoffset模式进行H2时间戳

时间:2018-06-13 20:06:58

标签: java sql-server hibernate spring-data-jpa h2

我正在为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,由于时间戳格式不同,从StringInstant的转换失败:

java.time.format.DateTimeParseException: Text '2018-06-13T19:53:55.903Z' could not be parsed at index 10

我让H2为我生成架构,将这些列创建为NVARCHAR,但我也尝试使用H2的TIMESTAMPTIMESTAMP WITH TIMEZONE类型手动创建表格。这些格式都不起作用。

改变实体或转换器不在我的范围内,所以我希望有一个特定于H2的解决方案。我可以强制H2使用我需要的时间戳格式,或者可能在我的测试中拦截转换/映射过程吗?我目前的解决方法是编写本机查询并调用H2的FORMATDATETIME(CreateTimestamp, 'yyyy-MM-dd HH:mm:ss.SSSSSSS XXX')函数,但我更愿意使用Spring存储库。

0 个答案:

没有答案