JPQL和带时区的时间戳

时间:2009-07-11 17:52:35

标签: java jpa 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和时区列的时区的指导吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:-2)

您可以查看java.util.Calendar。