一般的數據庫中,DATE字段僅僅表示日期,不包括日期信息,而Oracle數據庫中的DATE數據類型是包括日期、時間的,對於不同的Oracle jdbc驅動版本,對於該問題的處理都有些區別。
最近使用 ORACLE 10G,時間字段因需求,設為了DATE類型,發現hibernate用native SQL 查詢或ibatis獲取result.getObject()的時候顯示不了時分秒,原來是JDBC驅動自動把date映射為 java.sql.date,故截斷了時分秒信息,如果你使用9i或者11g 的驅動程序,就沒有該問題,但是Oracle10g的JDBC驅動,你會發現沒有時分秒
,在Oracle9.2之後,引入了內置數據類型TIMESTAMP。之所以引入它,是因為內置數據類型DATE的最小單位為秒;DATE的主要問題是它粒度不能足夠區別出兩個事件哪個先發生。9.2版本後ORACLE在DATE數據類型上擴展出來了TIMESTAMP數據類型,它包括了所有DATE數據類型的年月日時分秒的信息,而且包括了小數秒(納秒Nanoseconds級的)的信息。如果你想把DATE類型轉換成TIMESTAMP類型,就使用CAST函數。 也正是從oracle 9.2開始,內置數據類型DATE和TIMESTAMP在使用9i的JDBC驅動做查詢時,DATE被映射為java.sql.Date,TIMESTAMP被映射為java.sql.Timestamp。 從Oracle11開始,其JDBC驅動程序又重新開始回歸為將內置類型DATE映射為java.sql.Timestamp(正如9.2之前的那樣)。
所以,時分秒精度的丟失與hibernate無關,是oracle jdbc驅動的問題。最好的解決辦法就是:
【1】換驅動。經測試,將最開始使用的10g的驅動ojdbc14.jar換為11g的驅動ojdbc5.jar後;
1.1:分別換應用WEB-INFO/lib目錄下和Build Path引用。
1.2:如果是部署服務器應用還應當把was的配置改成ojdbc5.jar,具體截圖如下:
PS:${ORACLE_JDBC_DRIVER_PATH}路徑指向在was-環境-websphere變量處可以看到具體服務器配置路徑;
【2】數據庫中把 date 設為 timestamp 類型。