• [转]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);

  • 相关阅读:
    SpringBoot多数据源启动器
    数据结构模拟器
    mysql5.7查询今天、昨天、本周、上周、本月、上月数据
    SpringBoot项目本地可以发送邮件,部署到阿里云服务器发送邮件失败的解决方法
    Centos7搭建Maven私服-Nexus3.19.1-01
    Linux中部署jar包并指定日志输出文件
    ThreadLocal是什么?谈谈你对他的理解
    leetcode-双指针遍历
    不要再纠结css/js/html有没有必要放在WEB-INF下了
    数据库的表的字段名称与实体类(pojo)不对应解决方案
  • 原文地址:https://www.cnblogs.com/dirgo/p/5165361.html
Copyright © 2020-2023  润新知