JPQL и метка времени с часовым поясом - PullRequest
0 голосов
/ 11 июля 2009

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

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Я бы не использовал Date и Calendar в сущностях 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();
}
0 голосов
/ 30 марта 2010

Вы можете посмотреть на java.util.Calendar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...