我们的模型中有java.time.OffsetDateTime(JAVA8)类型的日期字段。我们使用Microsoft SQL Server作为数据库。数据库中的表列是datetimeoffset类型。我们使用Hibernate作为应用程序中的ORM。但我们无法使用Hibernate将java.time.OffsetDateTime字段存储到SQL Server datetimeoffset列。请让我们知道我们如何才能做到这一点?
rbpvctlc1#
添加下面的转换器类对我来说很有效。第二个格式化程序可能是由于命中了旧的SQL Server数据库或旧数据,我不确定,所以您可能不需要它:
@Converter(autoApply = true) public class OffsetDateTimeConverter implements AttributeConverter<OffsetDateTime, String> { private static DateTimeFormatter MAIN_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn xxx"); private static DateTimeFormatter SECONDARY_FROM_DB_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnn xxx"); @Override public String convertToDatabaseColumn(OffsetDateTime attribute) { if (attribute == null) { return null; } return attribute.format(MAIN_FORMATTER); } @Override public OffsetDateTime convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } try { return OffsetDateTime.parse(dbData, MAIN_FORMATTER); } catch (DateTimeParseException e) { // Some old? data has only 7 digits for nanoseconds return OffsetDateTime.parse(dbData, SECONDARY_FROM_DB_FORMATTER); } } }
tvokkenx2#
现代SQL Server JDBC驱动程序支持ResultSet.getObject(..., OffsetDateTime.class)中的OffsetDateTimeMap,但JDBC驱动程序没有标准的TIMESTAMP WITH TIMEZONE SQL类型,而是Microsoft发明了非标准的microsoft.sql.Types.DATETIMEOFFSET:https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-typesJDBC v4.2要求支持OffsetDateTime。
ResultSet.getObject(..., OffsetDateTime.class)
OffsetDateTime
TIMESTAMP WITH TIMEZONE
microsoft.sql.Types.DATETIMEOFFSET
2条答案
按热度按时间rbpvctlc1#
添加下面的转换器类对我来说很有效。第二个格式化程序可能是由于命中了旧的SQL Server数据库或旧数据,我不确定,所以您可能不需要它:
tvokkenx2#
现代SQL Server JDBC驱动程序支持
ResultSet.getObject(..., OffsetDateTime.class)
中的OffsetDateTime
Map,但JDBC驱动程序没有标准的TIMESTAMP WITH TIMEZONE
SQL类型,而是Microsoft发明了非标准的microsoft.sql.Types.DATETIMEOFFSET
:https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types
JDBC v4.2要求支持
OffsetDateTime
。