在很多時候,我們負責的項目中,在數據訪問層(DAO層)通常我們會使用sql語句或者hql語句,而在我們使用hql語句拼接時有時會報錯,通常的原因是:我們使用了標准的sql語句,開啟的確是hibernate的面向對象的語句 sessionFactory.getCurrentSession().createQuery(sql);
我們應改成 sessionFactory.getCurrentSession().createSQL(sql);就可以了。
但有時項目要求必須要使用hql,比如說將相應的接口都封裝成了jar包,本人就遇到了這樣的情況,在用hql語句比較當前時間時,一開始使用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 |
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,然后條件查詢的時候就查詢不出來任何東西。