0

我的 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 和时区列的时间戳的指导?

4

2 回答 2

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();
}
于 2011-11-24T12:45:29.810 回答
-3

你可以看看 java.util.Calendar。

于 2010-03-30T14:34:50.417 回答