У меня есть следующие определения полей в одном из моих объектов JPA:
@Column(nullable = false, name = "start_time",
columnDefinition= "TIMESTAMP WITH TIME ZONE")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date startTime = new Date();
@Column(nullable = true, name = "end_time",
columnDefinition= "TIMESTAMP WITH TIME ZONE")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date endTime = null;
База данных - PostgreSQL, и использование временной метки без часового пояса невозможно. Вставки и обновления идут нормально относительно часового пояса. Проблема возникает (по крайней мере, я так думаю), когда я пытаюсь выполнить запрос SELECT JPQL на некоторых тестовых данных, а параметры фильтра являются объектами Date. Генерируемый OpenJPA запрос не включает в параметры часовой пояс. Может ли кто-нибудь дать мне некоторые рекомендации относительно JPA и метки времени со столбцами часового пояса?
Ответ 1 · Archimedes Trajano
Я бы избегал использования даты и календаря в объектах JPA, когда они хранятся в базе данных. Стандартные временные значения JDBC не имеют концепции меток времени.
Вместо этого я использую следующий стиль
private Long effectiveDate;
public Date getEffectiveDate() {
if (effectiveDate == null) { return null; }
return new Date(effectiveDate);
}
public void setEffectiveDate(Date d) {
if (d == null) { effectiveDate = null; }
effectiveDate = d.getTime();
}
Фактически данные, которые сохраняются в базе данных, представляют собой простое длинное значение. Однако на уровне приложений вы по-прежнему используете объекты Date, которые имеют концепцию часовых поясов.
Теперь иногда вы все равно захотите сохранить дату для целей запроса на уровне базы данных. В этом случае вы можете сделать следующее
private Long effectiveDate;
private Date effectiveDateDate;
public Date getEffectiveDate() {
if (effectiveDate == null) { return null; }
return new Date(effectiveDate);
}
public void setEffectiveDate(Date d) {
effectiveDateDate = d;
if (d == null) { effectiveDate = null; }
effectiveDate = d.getTime();
}