2012-02-15 76 views
2

我有一个数据库表在Oracle Date柱,并通过获取该字段,如何通过JPA将Oracle Date字段正确转换为java.util.Date?

EntityManagerFactory emf = Persistence.createEntityManagerFactory("dbPU"); 
EntityManager em = emf.createEntityManager(); 

DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); 
String query = "SELECT T.MDATE FROM MTABLE T"; 

List<Object[]> resultList = em.createNativeQuery(query).getResultList(); 
for (Object[] data : resultList) { 
    System.out.println(dateFormat.format((java.util.Date) data[0])); 
} 

印刷日期的“日期”部分是正确的,但在“时间”(即小时和第二)部分是“00:00”为他们所有。但是,当我在SQL Developer中检查这个字段时,实际的“时间”部分不同于“00:00”。哪里有问题?提前致谢。

编辑: 我使用,

Hibernate-Version: 3.2.5.ga 
hibernate.dialect = org.hibernate.dialect.Oracle10gDialect 
Oracle JDBC Driver version 10.2.0.1.0 
Oracle Database 11g Express Edition Release 11.2.0.2.0 
+0

对此有帮助吗? http://www.coderanch.com/t/464371/ORM/java/JPA-Oracle-Date – 2012-02-15 17:37:46

+0

or this http://stackoverflow.com/questions/3469018/jpa-2-0-oracle-date-has-空时或http://stackoverflow.com/questions/6347532/jpa-entity-get-the-hours-minutes-and-sec-from-oracle-date-column – 2012-02-15 17:42:35

+0

没有链接不起作用。我在本地查询,因此没有包含“Date”属性和“@ Temporal”注释的实体类。此外,我试图从数据库读取,而不是写入它。把额外的信息放在这个问题上,看看这个版本。 – 2012-02-16 13:49:06

回答

6

好吧,我终于解决了我的问题。原因是通过其版本时间轴012d(和Timestamp)Oracle jdbc驱动程序的数据类型映射。总之,问题是通过将ojdbc14.jar驱动程序升级到ojdbc6.jar来解决的。有关详细信息请参阅What is going on with DATE and TIMESTAMP?

换句话说,在Oracle DATE类型被映射到Java如下:
ojdbc14.jar的:DATE > java.sql.Date
ojdbc6.jar:DATE > java.sql.Timestamp
其中java.sql.Date没有时间部分。

编辑17.03.2012:
如果没有机会到驱动程序升级由于其他限制,那么这里就是解决方法映射Oracle日期以java.sql.Timestamp中的JPA与Hibernate:

String queryStr = "SELECT T.MDATE FROM MTABLE T"; 
Query query = em.createNativeQuery(queryStr); 
SQLQuery sqlQuery = (SQLQuery) ((HibernateQuery) query).getHibernateQuery(); 
sqlQuery.addScalar("MDATE", Hibernate.TIMESTAMP); 
List<Object[]> resultList = query.getResultList(); 
+1

这太好了。但是,如果想要便携式解决方案,还应该考虑尽可能避免本机查询(即在99.99%的情况下) – perissf 2012-02-17 17:42:53

相关问题