1、hibernate很大的一个特点就是屏蔽了数据库的差异,使用了hibernate就应该尽量用HQL来操作数据库(除非不得不用数据库本身的一些特性),而对于时间类型的比较hibernate也是支持的。

HQL:     and acceptDate<=:end

用一个时间类型来替换参数end:query.setDate("end",endDate);

2、顺便在提一个问题,我们经常碰到查询从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),插入数据库的日期只有年月日.

            //用setTimestamp的方式,时分秒会被保存

            stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));

使用时需要注意的问题:

1,如果是用Hibernate的对象来影射数据库操作(save,load..),需要将mapping文件的type="date"改成type="timestamp".

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

 


posted on 2012-09-05 09:50  星^_^風  阅读(1038)  评论(0编辑  收藏  举报