@GeoffreyDeSmet Я не знаю, можно ли преобразовать один атрибут в два столбца базы данных. В любом случае, мое предложение не меняет вашу модель, оно только расширяет вашу модель. Вы можете оставить существующие геттеры и сеттеры (принцип «открыто-закрыто»). Если вы не можете добавить другое поле, вы застряли, насколько я знаю. JPA не может преобразовать один атрибут в два столбца в соответствии со спецификацией, которую я знаю.
я есть следующий класс сущности:
@Entity
public class Event {
private OffsetDateTime startDateTime;
// ...
}
Тем не мение,сохранение и последующее чтение сущности в / из базы данных с помощью JPA 2.2 приводит к потере информации:ZoneOffset
изstartDateTime
изменения кUTC
(ZoneOffset
используется меткой времени базы данных). Например:
Event e = new Event();
e.setStartDateTime(OffsetDateTime.parse("2018-01-02T09:00-05:00"));
e.getStartDateTime().getHour(); // 9
e.getStartDateTime().getOffset(); // ZoneOffset.of("-05:00")
// ...
entityManager.persist(e); // Stored startDateTime as timestamp 2018-01-02T14:00Z
Event other = entityManager.find(Event.class, e.getId());
other.getStartDateTime().getHour(); // 14 - DIFFERENT
other.getStartDateTime().getOffset(); // ZoneOffset.of("+00:00") - DIFFERENT
Мне нужно использоватьOffsetDateTime
: Я не могу использоватьZonedDateTime
потому что правила зоны изменяются (и это также страдает от этой потери информации в любом случае). Я не могу использоватьLocalDateTime
, так какEvent
происходит в любой точке мира, и мне нужен оригиналZoneOffset
с момента, когда это произошло по причинам точности. Я не могу использоватьInstant
потому что пользователь заполняет время начала события (событие похоже на встречу).
Требования:
Надо уметь выполнять>, <, >=, <=, ==, !=
сравнения по меткам времени в JPA-QL
Должен быть в состоянии получить то же самоеZoneOffset
по состоянию наOffsetDateTime
это было сохранено