2012-01-23 61 views
7

我有數據庫中的時間戳和應用程序我有日期。我喜歡以hibernate能夠將所有與日期匹配的條目,而不是時間部分的方式編寫hibernate條件。 例如只比較日期部分與休眠時間戳

在DB時間戳

2011-12-01 15點14分14秒

,並在應用

我確實有java.util.Date其中有默認時間的一部分。

我的問題是,當我用下面的代碼從搜索數據庫條目我什麼也沒有提前

回答

12

如果您正在尋找按日期範圍一個一般使用過濾(如從今天到明天)。 我用這種方式:

YourService.java

Date fromTimestamp = new Date(); 
Date toTimestamp = new Date(); 
Date fromDate = DateHelper.getDateWithoutTime(fromTimestamp); 
Date toDate = DateHelper.getDateWithoutTime(DateHelper.getTomorrowDate(toTimestamp)); 

YourDAO.java

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, fromDate)); 
criteria.add(Restrictions.le(TIMESTAMP_FIELD, toDate)); 

DateHelper.java

public static Date getDateWithoutTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    return cal.getTime(); 
} 

public static Date getTomorrowDate(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DATE, 1); 
    return cal.getTime(); 
} 

,當然還有 - 總是有空間在每個代碼中重構。

4

DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class); 
    criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate)); 
    List entries =this.getHibernateTemplate().findByCriteria(criteria); 

感謝像操作只能在字符串值中使用。在約會上沒有意義。

如果您有日期2011-12-01(假設yyyy-MM-dd這裏),並希望所有有自己的時間戳,這一天的行,那麼你正在尋找在時間戳>= 2011-12-01< 2011-12-02的所有行。

因此,每日1劑添加到您的日期(使用臨時日曆對象),並使用下面的代碼:

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate)); 
criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay)); 
+0

如果我轉換日期爲字符串,然後它顯示我2011-12-11 02:00:00' 如果我減去或添加一個天遂我的查詢不會拉似是而非的結果。通過這種方式,由於時間部分,我將得到指定日期之前那些謊言的條目。 – Rehman

+0

使用適當的日期限制。將所有時間字段(小時,分鐘,秒,毫秒)設置爲0.這使得下限。添加一天。這使得上限。 –

1
if (model.getFromDOE() != null) { 
     criteria.add(Restrictions.ge("createdDate", 
       getFormattedFromDateTime(model.getFromDOE()))); 
    } 

    if (model.getToDOE() != null) { 
     criteria.add(Restrictions.le("createdDate", 
       getFormattedToDateTime(model.getToDOE()))); 
    } 

private Date getFormattedFromDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTime(); 
} 

private Date getFormattedToDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 23); 
    cal.set(Calendar.MINUTE, 59); 
    cal.set(Calendar.SECOND, 59); 
    return cal.getTime(); 
}