最近在做業(yè)務(wù)開發(fā)的時候需要對數(shù)據(jù)庫進行索引操作,主要實現(xiàn)的是根據(jù)時間字段取出最近一個月登錄的數(shù)據(jù)丽惶,并且限制取出的數(shù)量缅阳。本來使用原生的SQL語句是非常容易實現(xiàn)的,可是項目使用的是Hibernate音羞,Hibernate對數(shù)據(jù)庫的操作使用的是HQL囱桨,是一種面向?qū)ο蟮牟樵冋Z言,類似于 SQL嗅绰,但不是去對表和列進行操作舍肠,而是面向?qū)ο蠛退鼈兊膶傩浴?HQL 查詢被 Hibernate 翻譯為傳統(tǒng)的 SQL 查詢從而對數(shù)據(jù)庫進行操作。
在下使用Java時間還不是很長窘面,對Hibernate還不是很熟悉翠语,結(jié)果發(fā)現(xiàn)原生的SQL語句Hibernate是不完全支持的,所以在此記錄下這個過程财边。
1肌括、sql語句時間比較和數(shù)量限制
先來復(fù)習(xí)一下sql語句實現(xiàn)的方法,假設(shè)數(shù)據(jù)庫的playerent表和playerstat通過guid字段主外健關(guān)聯(lián)酣难,其中playerstat表有字段lastlogintime記錄上次登錄時間谍夭,java定義的類為Date,持久化到 數(shù)據(jù)庫后的數(shù)據(jù)格式為:‘2017-07-22 14:22:12’憨募。
要實現(xiàn)判斷最近一個月的區(qū)間有兩種方法慧库,一是可以直接計算出當前的時間,以及一個月前的時間馋嗜,然后直接判斷即可齐板;第二種可以使用mysql提供的DATE_SUB()函數(shù),DATE_SUB()的文檔描述為:
定義和用法:
DATE_SUB() 函數(shù)從日期減去指定的時間間隔葛菇。
DATE_SUB(date,INTERVAL expr type)
date 參數(shù)是合法的日期表達式甘磨。expr 參數(shù)是您希望添加的時間間隔。
其中type有以下常用的可選(文檔地址:http://www.w3school.com.cn/sql/func_date_sub.asp):
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
...
最終實現(xiàn)的sql語句為:
SELECT ent.guid FROM playerent ent, playerstat stat
WHERE ent.guid = stat.guid
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= stat.lastlogintime
LIMIT 1000
其中CURDATE()為mysql獲取當前時間的函數(shù)眯停。
2济舆、Hibernate的實現(xiàn)
其實Hibernate要是直接支持mysql的日期操作函數(shù)上面的語句其實可以直接就用了,既然不支持就要看看Hibernate是怎么做日期的操作的莺债。
關(guān)于hql的知識這里就不展開說了滋觉,大家可以網(wǎng)上找找相關(guān)資料,下圖是Hibernate的架構(gòu)圖齐邦,大家可以看看這里相關(guān)介紹:http://wiki.jikexueyuan.com/project/hibernate/architecture.html
首先先建立查詢的hql語句:
SELECT ent.guid FROM PlayerEnt ent, PlayerStat stat
WHERE ent.guid = stat.guid
AND stat.lastlogintime >=:beginDate AND stat.lastlogintime < :endDate
可以看到查詢語句不會直接查詢數(shù)據(jù)庫的表了椎侠,而是查詢Java的對象,關(guān)于Hibernate這方面的知識在下后面再整理一篇博文出來措拇,這里先講述本文的主題我纪。
下面是Hibernate實現(xiàn)的代碼:
String hql = "SELECT ent.guid FROM PlayerEnt ent, PlayerStat stat
WHERE ent.guid = stat.guid
AND stat.lastlogintime >=:beginDate AND stat.lastlogintime < :endDate";
Query query = session.createQuery(hql);
query.setDate("beginDate", beginDate);
query.setDate("endDate", endDate);
query.setMaxResults(1000);
List<Long> list = query.list();
簡單解釋一下上面的代碼,session是Hibernate的會話,通過傳進來的hql字符串session可以創(chuàng)建一個查詢浅悉,hql語句可以通過參數(shù)綁定引用占位符趟据,“:beginDate”和“:endDate”就是上面的引用占位符,然后通過Query可以將hql語句的參數(shù)補全术健,最后使用query.setMaxResults(1000) 限制查詢數(shù)量汹碱,這里可以指定區(qū)間,配合setFirstResult方法荞估。
以上內(nèi)容就是使用Hibernate字段比較時間以及實現(xiàn)limit操作咳促,只是記錄下一些操作,權(quán)當筆記泼舱,說不定也有跟在下一樣剛?cè)胧謏ava的朋友也會遇到同樣的問題等缀,這里可以提供一些參考。