1. 程式人生 > >hibernate 時間範圍查詢

hibernate 時間範圍查詢

需求

  • 查詢某年、某月、某日資料資訊

實現 (createTime時間為例)

  • sql實現方式:

    SELECT * FROM table WHERE ${開始時間}<=createTime<=${結束時間}

  • hql 實現方式:

    FROM tableEntity WHERE ${開始時間}<=createTime<=${結束時間}`

問題

  • 每次查詢類似的時間維度資料,必須先找到這個時間維度的開始時間和結束時間,這個流程我是比較討厭的。比如我要查詢2016年到2017年資料,那麼就需要找到2016年初的第一刻時間,到2016年最後時刻時間。雖然都會使用工具類處理,但是每次都這麼寫還算是比較崩潰,特別是查詢這種資料一次性涉及的表比較多的情況。

相對好的解決方式

  • 搜尋了不少部落格,沒有直接提到如何更好的書寫這種查詢,不過搜到了hql支援的一些函式Hibernate中HQL函式彙總及其說明,裡面hql支援的函式還算是不少。其中主要關注到有時間提取的函式YEAR(d)、MONTH(d)、DAY(d)、HOUR(d)、MINUTE(d)、SECOND(d)…有這些就足夠我們做一定時間維度的查詢,具體函式意思可以參考部落格。還是以2016至2017年時間資料為例,以上hql就可以修改為:

    FROM tableEntity WHERE YEAR(createTime) = 2016
  • 如果說要查詢當前時間年月資料可修改為(其他類推):

    FROM tableEntity WHERE YEAR(createTime) = YEAR(#{當前時間}) AND MONTH(createTime) = MONTH(#{當前時間})

    如此就不需要每次都要先去通過工具類找到開始結束時間

最後

  • 感覺這種寫法也不是特別好的處理,不知道還有沒有更好的寫法,這裡先做記錄。另外,我查了一下mysql也有該種函式,寫生sql也可以參考hql查詢時間維度。