我在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
答案 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();