Hibernate中HQL函数汇总

       在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,

通常的原因是:我们使用了标准的sql语句,开启的确是hibernate的面向对象的语句

                   sessionFactory.getCurrentSession().createQuery(sql);

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

必须要使用HQL语句:

函数名称


说明 类型 支持 使用方法 备注
ABS(n) 取绝对值 数学函数 JPAQL HQL ABS(column_name[数字类型对象属性])
SQRT(n) 取平方根 数学函数 JPAQL HQL SQRT(column_name[数字类型对象属性])
MOD(x,y) 取余数 数学函数 JPAQL HQL MOD([对象属性(数字)或值],[对象属性(数字)或值]) 数字必须是整型,返回参数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 HQL CONCAT([对象属性],[对象属性])
SUBSTRING(s,offset,length) 返回子串 字符串函数 JPQHQL HQL SUBSTRING([要截取的字符串属性字段],开始位置,截取长度)
TRIM([[BOTH/LEADING/TRAILING]] char FROM s) 默认去掉字符串两面的空格 字符串函数 JPQHQL HQL TRIM([字符串对象属性列]) 将字段两端的空格去掉
LOWER(s) 小写 字符串函数 JPQHQL HQL LOWER([字符串对象属性列]) 将该列结果含有的字母全部大写
UPPER(s) 大写 字符串函数 JPQHQL HQL UPPER([字符串对象属性列]) 将该列结果含有的字母全部大写 
LENGTH(s) 返回字符串长度 字符串函数 JPQHQL HQL LENGTH(字段名) 返回字段内容的长度,包括数字。null值返回null.
CURRENT_DATE() 返回数据库当前日期 时间函数 JPAQL HQL CURRENT_DATE() 返回数据库当前日期
CURRENT_TIME() 时间 时间函数 JPAQL HQL CURRENT_TIME() 返回数据库当前时间
SECOND(d) 从日期中提取具体秒 时间函数 HQL SECOND(时间字段) 空的时候返回null
MINUTE(d) 从日期中提取具体分 时间函数 HQL MINUTE(时间字段) 空的时候返回null
HOUR(d) 从日期中提取具体小时 时间函数 HQL HOUR(时间字段 空的时候返回null
DAY(d) 从日期中提取具体天 时间函数 HQL DAY(时间字段) 空的时候返回null
MONTH(d) 从日期中提取具体月 时间函数 HQL MONTH(时间字段) 空的时候返回null
YEAR(d) 从日期中提取具体年 时间函数 HQL YEAR(时间字段) 空的时候返回null

1、UNIX_TIMESTAMP()转换到秒,到1970年

2、FROM_UNIXTIME 从秒专函到时间

3、current_date()当前日期

4、current_time()当前时间

5、current_timestamp()当前时间戳

6、TO_DAYS()转换为天

7、FROM_DAYS从天转换到时间

例子:
1、from Article where UNIX_TIMESTAMP(addTime) > UNIX_TIMESTAMP(current_timestamp()) - 24 * 60 * 60
2、from Article where TO_DAYS(addTime) > TO_DAYS(current_timestamp()) - 1
注意:hql语句中不推荐使用
from Article where addTime > current_date() - 1这种写法,通常情况下是没有问题,但遇到特殊情况就会产生异常。

例如当前日期为11月1号,则current_date() - 1会生成日期1970-01-01,然后条件查询的时候就查询不出来任何东西。

可以写hql测试 select current_date() - 1 from Article;  其中Article为一个实体类,测试的时候,

将数据库所在的服务器时间修改为某月的1号,打印查询的list返回结果集合中的一个

  String hql = "select current_date() - 1 from Article";

       List ret = session.createQuery(hql).setMaxResults(1).list();

       if(ret.size() > 0){

              Object entry = ret.get(0);System.out.println(entry);

       }else{System.out.println("null");}


附:mysql支持的时间处理函数
DATE_ADD()、DATE_SUB()、TO_DAYS()、FROM_DAYS()、STR_TO_DATE()、CURRENT_TIMESTAMP()、UNIX_TIMESTAMP()、FROM_UNIXTIME()



你可能感兴趣的:(JAVA,框架)