[轉]Hibernate時間總結


原文地址:http://blog.csdn.net/woshisap/article/details/6543027

1:Hibernate操作時間需要注意的問題

 

 

 

 

    hibernate很大的一個特點就是屏蔽了數據庫的差異,使用了hibernate就應該盡量HQL來操作數據庫(除非不得不用數據庫本身的一些特性),而對於時間類型的比較hibernate也是支持的。

HQL:     and acceptDate<=:end

用一個時間類型來替換參數end:query.setDate("end",endDate);

順便在提一個問題,我們經常碰到查詢從A(起始時期)到B(結束日期)的紀錄。

如果數據庫中字段類型為timestamp,那么查詢2005-11-23到2005-11-23的紀錄時不會出現2005-11-23那一天的紀錄,哪怕你的比較符號用的是>=和<=;因為數據庫中的2005-11-23的紀錄是這樣的格式

2005-11-23 15:35:48:253,而query.setDate設置一個時間參數進去,他是用這個時間比較的

2005-11-23 00:00:00 000,

所以因該用query.setTimeStamp("end",endDate);

如果從view層取到的date不包含后面的time信息,最好

                 endDate.setHours(23);

                 endDate.setMinutes(59);

                 endDate.setSeconds(59);

對開始時間

startDate.setHours(0)

startDate.setMinutes(0);

startDate.setSeconds(0);

這樣就是查詢 A-0:0:0 到 B-23:59:59時間段的數據:

3:程序積累

  實例一:

Hibernate在保存和更新Date類型的數據到數據庫的時候,如果設置不當,會舍棄時分秒,和數據庫中Date類型的精確度不符(如Oracle的Date是帶時分秒的).

引起的原因主要是mapping文件中的字段類型被設成了 type="date",而mapping文件一般都是通過hibernate提供的工具生成的,hibernate提供的工具默認把數據庫端date型 的字段設成type="date".從而Hibernate在用JDBC做數據庫更新的時候會用 statement的setDate(index, sqlDate),插入數據庫的日期只有年月日.

下面的JDBC代碼演示了這個問題:

            String sql = "UPDATE Timetest T SET T.datev=? WHERE T.id=?";
            stmt = conn.prepareStatement(sql);

            // java.sql.Date sqlDate = new java.sql.Date(26,7,2010);
            // sqlDate.setTime(System.currentTimeMillis());
            // stmt.setDate(1, sqlDate); //如果是用setdate的方式,時分秒會被舍棄


            //用setTimestamp的方式,時分秒會被保存
            stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));

            stmt.setLong(2, 1L);
            stmt.executeUpdate();
            conn.commit();

使用時需要注意的問題:

1,如果是用Hibernate的對象來影射數據庫操作(save,load..),需要將mapping文件的type="date"改成type="timestamp".

2,如果用Query(session的createQuery和createSQLQuery),在賦值的時候用query.setTimestamp(0, new Date());

 

 

String   hql   =     "   from   table   tb   where   tb.startdate   =   :Startdate "; 
Query   q   =   session.createQuery(hql).setString( "Startdate ",   sdate); 
修改為: 
String   hql   =     "   from   table   tb   where   tb.startdate   like   :Startdate "; 
Query   q   =   session.createQuery(hql).setString( "Startdate ",   sdate+ "% "); 

 

 實例二:

java.sql.Date   beginDate=java.sql.Date.valueOf( "2006-6-1 "); 
java.sql.Date   endDate=java.sql.Date.valueOf( "2006-6-2 "); 
"from   table   tb   where   tb.startdate   <:endDate   and   tb.startdate   > =   :beginDate "; 
query.setDate( "beginDate ",beginDate); 
query.setDate( "endDate ",endDate);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM