2012-02-15 74 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

相關問題