Hibernate HQL查询中对日期的查询操作总结

来源:互联网 发布:淘宝天天特价 编辑:程序博客网 时间:2024/05/16 04:47

数据库表部分数据:

SQL> select * from t_class;

   CLASS_ID CLASS_NAME                                                   CLASS_CREATETIME

----------- ------------------------------------------------------------ --------------------------------------------------------------------------------

          1 班级1                                                                            22-1月 -08 03.03.52.717000 下午

          9 班级2                                                                            20-1月 -08 05.04.30.577000 上午

         18 班级3                                                                           15-3月 -08 11.08.03.204000 上午

         28 班级4                                                                            23-3月 -08 06.05.03.040000 下午

         39 班级5                                                                            24-4月 -08 01.22.50.090000 下午



关键:注意类型匹配,看比较的是日期类型还是字符串类型。

//查询2008-1月-1日到2008-2月-1日建立的班级

                            String hql = "select c.id, c.name from MyClass c where c.createTime between ? and ?";//这里的问号要传入的是日期对象

                            //在hql中可以使用数据库的函数,如:Mysql数据库中的date_format

                            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                           

                            List list =session.createQuery(hql)

                                               .setParameter(0,format.parse("2008-01-01 00:00:00"))//此时应传入Date类型

                                               .setParameter(1,format.parse("2008-01-31 23:59:59"))

                                               .list();

查询2008-1月建立的班级:

可以利用数据库中的函数,但要注意不同数据库的函数可能不同:例如Mysql中有date_format函数,而oracle中则是用to_char将日期转为指定形式的字符串

String hql = "select c.id, c.name from MyClass c where to_char(c.createTime,'yyyy-MM')=?";

//如果是mysql数据库,where条件应该使用date_format函数写成date_format(c.createTime,'%y-%M')=?

List list = session.createQuery(hql).setParameter(0,"2008-01").list();//此时应传入字符串类型,应为to_char已将日期转为指定形式的字符串

也可以使用oracle数据的函数to_date,将传入的字符串转化为指定格式的日期对象

String hql = "select id,name from MyClass c where c.createTime between to_date(?,'yyyy-MM-dd HH24-mi-ss') and to_date(?,'yyyy-MM-dd HH24-mi-ss')";

                            List list = session.createQuery(hql)

                                               .setParameter(0,"2008-01-01 00:00:00")

                                               .setParameter(1,"2008-01-31 23:59:59")

                                               .list();

注意oracle中使用to_date时有可能出现如下报错:

1ERROR JDBCExceptionReporter:101 - ORA-01810:格式代码出现两次

这是由于输入日期模式时输入的是:yyyy-MM-dd HH24-mm-ss。oracle认为出现了两次mm,将分钟的mm改为mi。

2ERROR JDBCExceptionReporter:101 - ORA-01849:小时值必须介于 1 12 之间

如果要使用24小时制要写成:'yyyy-MM-dd HH24-mi-ss',而不能直接写yyyy-MM-dd HH-mi-ss'



原创粉丝点击