2010-07-27 78 views
0

我正在使用SQL Server數據庫和Hibernate。我有相關的存儲日期如下問題:休眠日期映射問題

我有以下代碼:

String hql = "select user from User user where user.createDate = :date"; 
Query query = HibernateUtil.getSession().createQuery(hql); 
Date date2 = DateHelper.getEndOfDay(new Date());//this returns 2010-07-27 23:59:59.999 
query.setParameter("date", date2); 

當我比較日期2010-07-27 23:59:59.999我得到的是有日期的結果:2010-07-28 00:00:00.0。使用setDate()而不是setParameter()會返回保存日期在同一天的用戶,這意味着小時,分鐘等被丟棄。

hibernate將日期映射到java.util.Date,但在結果列表中,一切都是Timestamp,我猜是因爲Timestamp擴展了java.util.Date。 爲了在比較平等時取得好成績,你會建議做什麼?

回答

1

我認爲這個問題與MSSQL數據庫有關,因爲它以3毫秒的精度保存日期,如this後的回答之一所示。

所以問題是,因爲時間23:59:59.999不能保存在MSSQL中(可能具有3毫秒的精度,所以當與從數據庫檢索到的時間比較時,不能得到999)當它轉換爲MSSQL兼容日期時,它最終會成爲第二天。

我認爲這是我在這裏看到的真正問題。爲了避免這種情況,我想我應該格式化我保存的日期。

1

您試過Query.setDate()Query.setTimestamp()

+0

setDate()不好,因爲它讓我回到所有在同一天的日期的用戶,這意味着小時和秒等被丟棄。 – Atticus 2010-07-27 11:46:31

+0

但時間戳應該沒問題(如果你得到毫秒FR你的日期)。 (+1) – Bozho 2010-07-27 12:08:04

+0

在你的問題中,你提到了幾次「日期」,所以我不確定你的意思是「日期」還是「日期/時間」,並且都包含在我的答案中。 – 2010-07-27 12:20:21

0

如果可能,我建議您使用JODA DateTime API。使用joda-hibernate project中的PersistentDateTime休眠用戶類型類,將DateTime對象保留到數據庫。

+0

除了使用此API之外是否還有其他替代方法? – Atticus 2010-07-27 11:55:26

+0

不使用喬達時間不是問題。 – 2010-07-27 22:26:35

+0

這只是這個API有一些驚人的便利/常識方法,否則在定製開發項目中很難找到。當然,這不是一個'問題',你沒有專門使用這個問題。如果沒有替代品,我會感到驚訝。任何人都知道任何好的選擇? – Jatin 2010-07-29 11:46:10