標籤:
在很多時候,我們負責的項目中,在資料訪問層(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,然後條件查詢的時候就查詢不出來任何東西。
Hibernate中HQL函數匯總及擷取目前時間進行比較舉例