2009-07-11 2 views
0

У меня есть следующие определения полей в одном из моих JPA сущностей:JPQL и временная метка с временной зоной

@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 и timestamp с колонками часовых поясов?

ответ

0

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