JPQL и отметка времени с часовым поясом

У меня есть следующие определения полей в одном из моих объектов 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 и метки времени со столбцами часового пояса?


person Vasil    schedule 11.07.2009    source источник


Ответы (2)


Я бы избегал использования даты и календаря в объектах 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();
}
person Archimedes Trajano    schedule 24.11.2011

Вы можете взглянуть на java.util.Calendar.

person CalendarGuy    schedule 30.03.2010