原文地址: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);
