最近使用Hibernate (版本为3.x) 做条件查询时,用到了时间区间段检索,但是当用setDate()时遇到了一个问题,如下
假如 :
startTime = 2019-07-01 00:00:00
endTime = 2019-07-01 23:59:59
并且数据库有一条2019-07-01的记录
Query query = session.createQuery("from User u where u.createTime>=? and u.createTime<=?");
query.setDate(0, startTime );
query.setDate(1, endTime );
经过上面的调用却查询不到 2019-07-01 的数据,但在数据库中通过sql:
select * from t_user u where u.createTime>='2019-07-01 00:00:00' and u.createTime<= '2019-07-01 59:59:59'
却可以查到该条记录,后来经过网上的资料翻阅,结论如下:
因为Query对象的setDate()方法在赋值时,若条件中带有 "=" 号,HIbernate默认把赋值日期后面的时分秒给截取掉,只留下了年月日,如果只是通过 ">" 或者 "<" 进行日期比较是没问题的。
有三种方法可以解决这个问题:
1、通过setCalendar()赋值
2、通过setTimestamp()赋值
3、将setDate()更改为setString(),使用字符串的形式做查询也是可以的正常查询,如:
Query query = session.createQuery("from User u where u.createTime>=? and u.createTime<=?");
query.setString(0, "2019-07-01 00:00:00");
query.setString(1, "2019-07-01 59:59:59");
该问题最终通过上述方法得到了解决!