我的一个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和时区列的时区的指导吗?
答案 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。