2008-11-14 35 views
27

將日期分配給指定的SQL參數時,Hibernate會自動將其轉換爲GMT時間。你如何讓它在所有日期使用當前的服務器時區?如何將日期參數分配給當前時區的Hibernate查詢?

比方說你有一個查詢:

Query q = session.createQuery("from Table where date_field < :now"); 
q.setDate("now", new java.util.Date()); 

「現在」將被設置爲GMT時間,而「新的Date()」獲得當前的服務器時間。

謝謝。

回答

57

事實證明,Hibernate不會自動將日期轉換爲GMT,如果您使用query.setDate(),它只會中斷時間,所以如果您通過「2009-01-16 12:13:14」它會變成「2009-01 -16 00:00:00「。

要考慮時間,您需要使用query.setTimestamp("date", dateObj)來代替。

+1

這也只是咬我一口。在Oracle中,`DATE`是一個日期和時間,它與Java的Date相匹配,而TIMESTAMP是一個微秒的日期和時間。 – 2012-02-29 23:05:22

2

休眠不知道時區。任何時區轉換都應在執行查詢之前完成。例如,如果您的數據庫服務器設置爲CST,但用戶在EST上,則需要將1小時添加到作爲查詢輸入的任何時間戳。

2

我們使用自定義的Hibernate日期類型。任何時候我們在查詢中設置參數時,我們都會使用基類或實用工具方法,以便將用戶的時區傳遞到自定義類型參數中。

您可以通過手動調整實用程序方法中查詢的時間來獲取,但這樣讀取或寫入數據庫的日期也可以正確轉換。此方法還處理數據庫將日期存儲在其本地時區中的情況。所以,即使你在一個時區內有一個用戶,在另一個時區內有一個數據庫服務器,而使用GMT的Java也可以讓所有事情都變得直截了當。它結束了看起來像:

Properties properties = new Properties(); 
properties.setProperty("timeZone", databaseTimeZone); 
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties)); 

作爲額外的獎勵,我們用這個對付的SQL Server轉換23的事實:59:59.999到第二天。在自定義類型中,我們檢查並退回。

2

如果您需要timeZone同步值,您可以在您的HQL中使用now()。另外我建議你使用Joda庫。它有一個hibernate插件模塊。

相關問題