2011-06-14 46 views
4

我有问题从我的Oracle DB(dd/mm/yyyy hh/mm/ss)中获取完整的DATE信息。JPA实体:从Oracle DATE列中获取小时,分钟和秒

在db级,列,我想收到我设置的测试值:

update my_table 
set my_date_column=(to_date('2011-06-15 15:43:12', 'yyyy-mm-dd hh24:mi:ss')); 

但在我的JPA实体我有:

@Column(name = "MY_DATE_COLUMN") 
@Temporal(TemporalType.DATE) 
private Date dateDetailed; 


public Date getDateDetailed() { 
    if (this.dateDetailed!= null) { 
     return this.dateDetailed; 
    } 
    return null; 
} 

public void setDateDetailed(Date dateDetailed) { 
    if (dateDetailed!= null) { 
     this.dateDetailed= dateDetailed; 
    } else { 
     this.dateDetailed= null; 
    } 
} 

每次我acccess我的对象,它给我的日期不分小时,分钟和秒。

我试过使用TemporalType.TIMESTAMP,但在这种情况下,我还需要更改db中的列类型(我想避免)。

有什么建议吗?

回答

3

TemporalType.DATE 您将需要TIME或TIMESTAMP。 DATE只是没有时间的日期。 TIMESTAMP表示为一个数字。

+0

TemporalType.DATETIME无效javax.persistence.TemporalType类型。只有有效的是DATE,TIME和TIMESTAMP。如果我使用TIMESTAMP,那么我必须将数据库中的列的类型更改为TIMESTAMP而不是DATE,并且如果可能,我想避免这种情况。 – gospodin 2011-06-14 17:40:26

+1

不幸的是,无论如何,你都需要这样做。如果创建了一个DATE类型的Oracle列,它不会将时间信息与日期一起存储,例如'create table foo(bar date);'。如果你创建了这个表,然后执行你提到的插入,你会注意到时间信息被删除了,而列只包含'15 -JUN-2011'而不是预期的'15-JUN-11 03.43.12.000000000 PM'(从sql dev输出中看到)。数据库列必须能够支持数据以便JPA提供所需的功能。 – 2011-06-14 17:57:47

+0

@Kris在这种情况下,你能解释一下为什么,如果在DATE列中我只能存储日期,我的选择会给我真正的价值,包括小时,分钟和秒钟?另外,为什么使用EJB2实体bean的列类型DATE可以检索小时,分钟和秒? – gospodin 2011-06-14 21:43:47

2

通过使用TIMESTAMP时态类型,您将获得java日期数据类型的日期和时间部分,但是Oracle将使用TIMESTAMP数据类型创建一个列。如果您希望一个DATE数据类型解决这个问题,你可以使用列注释的columnDefinition参数如:

@Column(name = "MY_DATE_COLUMN", columnDefinition = "DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date dateDetailed; 
+0

谢谢@gerardnico ... – xild 2014-03-19 14:25:19