使用QBC方式查询数据库,如果查询条件包含日期,则比较难以处理,尤其是在不是简单的在某个日期之前,或在某个日期之后的情况时,不能用hibernate常用方式,要用原生sql语句执行查询。
1、hibernate常用方式
方法 说明
Restrictions.eq =
Restrictions.allEq 利用Map来进行多个等于的限制
Restrictions.gt >
Restrictions.ge >=
Restrictions.lt <
Restrictions.le <=
Restrictions.between BETWEEN
Restrictions.like LIKE
Restrictions.in in
Restrictions.and and
Restrictions.or or
使用以上格式进行日期的简单比较,举例:
Criteria crit = session.createCriteria(TpPcdaily.class);
crit.add(Restrictions.eq("ppRepdate", nowdate));
其中TpPcdaily为数据库表对应在程序中的持久化类,ppRepdate为持久化类日期类型字段,nowdate为日期参数,要求必须为日期类型。
2、原生sql语句
Restrictions.sqlRestriction 用SQL限定查询
使用原生sql语句可以大大扩展QBC方式,举例:
Criteria crit = session.createCriteria(TpPcdaily.class);
crit.add(Restrictions.sqlRestriction("datediff(month, {alias}.PM_REPDATE, ‘"+onedate+"‘)=0"));
其中TpPcdaily为数据库表对应在程序中的持久化类,由于使用原生sql语句,故要使用数据库中的字段,PM_REPDATE为数据库表日期类型字段,onedate为日期参数,要求必须为String类型。{alias}表示将被替换成查询实体的列别名,通过观察后台运行,发现后台执行的语句为this_ where datediff(month, this_.PM_REPDATE, ‘2014-12-01‘)=0,可见在执行过程不完全是我们写的sql语句,而是对字段或其他一下词语进行修饰,比如在前增加类似this_的修饰,{alias}被替换成this_。