Моему приложению Spring Boot требуется хранить и выражать все даты и время в формате UTC, поэтому POJO в приложении используют тип данных OffsetDateTime
, а база данных SQL Server 2016 использует тип столбца datetimeoffset(7)
.Библиотека JDBC ms-sql 6.1.0.0
, драйвер, совместимый с JDBC 4.2.Версия JVM - Oracle Java 8.
Я использую Spring JDBC и NamedParameterJdbcTemplate
для реализации класса реализации DAO. Нет JPA, ORM и т. Д.
При вставке записи я использую jdbcTemplate.update(String, Map<String,Object>)
.Похоже, что это работает, за исключением , что значения, сохраненные в базе данных, не совпадают с теми, которые я указал на карте.Например, namedParameters.put("record_datetime", someEntity.getRecordDatetime());
, где свойство recordDatetime
этого объекта содержит значение 2018-05-31T13:20:01Z
, сохраняется в базе данных как 2018-05-31T20:20:01.0000000+00:00
.Я нахожусь в часовом поясе GMT-7, но свойство использует тип данных OffsetDataTime
без смещения, то есть, по сути, это GMT.
У меня есть большая проблема под рукой, когда я пытаюсь получить значениеиз базы данных.Я использую jdbcTemplate.queryForObject(String, Map<String,?>, RowMapper<T>)
, а в RowMapper я использую resultSet.getObject("record_datetime", OffsetDateTime.class)
.Это приводит к исключению:
java.sql.SQLFeatureNotSupportedException: This operation is not supported.
Я пытался использовать OffsetDateTime.ofInstant(resultSet.getObject("record_datetime", Instant.class), ZoneId.of("UTC"))
.Выдается то же исключение, что и выше.
Это должно быть очень распространенным требованием, чтобы иметь возможность хранить значения в UTC и / или со значениями смещения.В других приложениях я использовал java.util.Date
и либо java.sql.Date
(или java.sql.Timestamp
) в DAO для сохранения значений даты или даты и времени, и это в целом работало хорошо.Мне как-то сложно это реализовать.