2009-06-11 67 views
15

我有一張表(在Oracle 9及更高版本中),我需要使用Hibernate查找給定日期的所有條目。這些條目有時間戳(數據類型爲「日期」)。一些條目有時間,其他條目只有一個日期。這是不能改變的,因爲這是我無法改變的其他應用程序的輸出。在SQL我會寫沿使用HQL查詢日期而忽略Oracle上的時間

SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009') 

線的東西,以獲得我尋找的日期的所有條目。我想知道如何讓Hibernate使用HQL來做到這一點。我知道我可以在Hibernate中使用SQL查詢,但這似乎不那麼幹淨。有沒有辦法做到這一點?如果可能的話,這種方式也應該適用於時間戳將是數據類型的非oracle數據庫。

回答

14

您可以在您的HQL中放入兩個約束,一個指定大於或等於搜索日期的開始日期,另一個指定小於第二天的日期。

table.date >=11.06.2009 AND table.date < 11.07.2009 

HQL(以及SQL)也允許:

table.date between 11.06.2009 AND 11.07.2009 

記住between總是包容的,這意味着它是兩者分別>=<=。在這裏between
更多細節:http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

2

我認爲有兩種方法來解決這個問題:

  1. 使用criteria查詢並添加SQLRestriction。限制將採用「trim({別名} .date)=?」的形式。這裏的問題可能是將輸入參數轉換爲Oracle(或其他DBMS)上的正確類型。您可以提供必要的(hibernate)類型作爲參數,但如果這是數據庫相關的,它將被硬編碼。在你的hibernate映射中使用formula。映射將是:

 <class name="Person"> 
     <property name="birthDay" formula="trim(birthDay)"/> 
    </class>

您現在可以使用Hibernate的類型系統使用與Java對象這樣的比較:

s.createCriteria(Person.class) 
.add(Restrictions.eq("birthDay", new java.sql.Date(System.currentTimeMillis()))) 
.list() 

一個問題你必須與這兩個解決方案是數據庫中可能不提供trim函數。對此的解決方案(例如,在HSQLDB上進行測試時)是將一個import.sql放到classpath測試中(這將由Hibernate自動獲取)並在那裏創建一個過程或函數。您也可以在該文件中使用Alter table Person add column birthDay timestamp以使生成的模式起作用。

-1

您可以使用trunc()函數刪除DATE列中的時間部分。

如:select * from emp where trunc(emp_date) < trunc(current_date()-30)

取誰被僱用1個月

+8

如果是2月? – Setori 2010-05-14 06:45:34

2

之前CustomHQL有關的所有僱員的詳細信息,你可以嘗試TRUNC關鍵字

對於防爆:

SELECT T0.FirstName as FirstName ,T0.LastLoginDate as LastLoginDate FROM User T0 
WHERE (trunc(T0.LastLoginDate) >= :LastLoginDate) ORDER BY T0.LastLoginDate 

注意:其中:LastLoginDate是一個參數。

這對我來說是訣竅。