如何通过JPA将Oracle Date字段正确转换为java.util.Date?

时间:2012-02-15 17:21:30

标签: java oracle date jpa

我在db表中有一个Oracle 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

1 个答案:

答案 0 :(得分:6)

好的,我终于解决了我的问题。原因是Oracle jdbc驱动程序通过其版本时间轴的Date(和Timestamp)数据类型映射的冒险。简而言之,通过将 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:
如果由于其他限制而无法升级驱动程序,那么这里是使用Hibernate将Oracle DATE映射到JPA中的java.sql.Timestamp的解决方法:

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();