Hibernate中HQL函数汇总及获取当前时间进行比较举例

Hibernate中HQL函数汇总及获取当前时间进行比较举例

  在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hibernate的面向对象的语句 sessionFactory.getCurrentSession().createQuery(sql);

我们应改成 sessionFactory.getCurrentSession().createSQL(sql);就可以了。

  但有时项目要求必须要使用hql,比如说将相应的接口都封装成了jar包,本人就遇到了这样的情况,在用hql语句比较当前时间时,一开始使用sql语句进行拼接,结果一直报错。在这里给大家展示一下Hql常用的函数吧:

  

 函数名称说明类型支持使用方法备注
ABS(n)取绝对值数学函数JPAQL HQLABS(column_name[数字类型对象属性]) 
SQRT(n)取平方根数学函数JPAQL HQLSQRT(column_name[数字类型对象属性]) 
MOD(x,y)取余数数学函数JPAQL HQLMOD([对象属性(数字)或值],[对象属性(数字)或值])数字必须是整型,返回参数1/参数2得的余数
SIZE(c)方法集合内对象数量集合函数JPAQL HQL  
MINELEMENT(c)返回集合中最小元素集合函数HQL  
MAXELEMENT(c)返回集合中最大元素集合函数HQL  
MININDEX(c)返回索引集合最小索引集合函数HQL  
MAXINDEX(c)返回索引集合最大索引集合函数HQL  
MAX(n)返回最大值集合函数JPQHQL HQL  
MIN(n)返回最小值集合函数JPQHQL HQL  
COUNT(n)返回计数集合函数JPQHQL HQL  
CONCAT(s1,s2)连接连个字符串字符串函数JPQHQL HQLCONCAT([对象属性],[对象属性]) 
SUBSTRING(s,offset,length)返回子串字符串函数JPQHQL HQLSUBSTRING([要截取的字符串属性字段],开始位置,截取长度) 
TRIM([[BOTH/LEADING/TRAILING]] char FROM s)默认去掉字符串两面的空格字符串函数JPQHQL HQLTRIM([字符串对象属性列])将字段两端的空格去掉
LOWER(s)小写字符串函数JPQHQL HQLLOWER([字符串对象属性列])将该列结果含有的字母全部大写
UPPER(s)大写字符串函数JPQHQL HQLUPPER([字符串对象属性列])将该列结果含有的字母全部大写 
LENGTH(s)返回字符串长度字符串函数JPQHQL HQLLENGTH(字段名)返回字段内容的长度,包括数字。null值返回null.
CURRENT_DATE()返回数据库当前日期时间函数JPAQL HQLCURRENT_DATE()返回数据库当前日期
CURRENT_TIME()时间时间函数JPAQL HQLCURRENT_TIME()返回数据库当前时间
SECOND(d)从日期中提取具体秒时间函数HQLSECOND(时间字段)空的时候返回null
MINUTE(d)从日期中提取具体分时间函数HQLMINUTE(时间字段)空的时候返回null
HOUR(d)从日期中提取具体小时时间函数HQLHOUR(时间字段空的时候返回null
DAY(d)从日期中提取具体天时间函数HQLDAY(时间字段)空的时候返回null
MONTH(d)从日期中提取具体月时间函数HQLMONTH(时间字段)空的时候返回null
YEAR(d)从日期中提取具体年时间函数HQLYEAR(时间字段)空的时候返回null

eg:数据库某个时间与当前时间进行比较

 1. String hql = "FROM " + User.class.getName() + " WHERE (TO_DAYS(registerDate) >= TO_DAYS(current_timestamp()) AND TO_DAYS(registerDate) <  TO_DAYS(current_timestamp()) + 1)   ";

 2.   String hql = "FROM " + User.class.getName() + " WHERE UNIX_TIMESTAMP(insertTime) > UNIX_TIMESTAMP(current_timestamp()) - 24 * 60 * 60 ";

注意:hql语句与sql语句都不推荐使用current_date() - 1或者currentdate()+1这种写法,通常情况下是没有问题,但遇到特殊情况就会产生异常。例如当前日期为11月1号,则current_date() - 1会生成日期1970-01-01,然后条件查询的时候就查询不出来任何东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值