我有數據庫中的時間戳和應用程序我有日期。我喜歡以hibernate能夠將所有與日期匹配的條目,而不是時間部分的方式編寫hibernate條件。 例如只比較日期部分與休眠時間戳
在DB時間戳2011-12-01 15點14分14秒
,並在應用
我確實有java.util.Date其中有默認時間的一部分。
我的問題是,當我用下面的代碼從搜索數據庫條目我什麼也沒有提前
我有數據庫中的時間戳和應用程序我有日期。我喜歡以hibernate能夠將所有與日期匹配的條目,而不是時間部分的方式編寫hibernate條件。 例如只比較日期部分與休眠時間戳
在DB時間戳2011-12-01 15點14分14秒
,並在應用
我確實有java.util.Date其中有默認時間的一部分。
我的問題是,當我用下面的代碼從搜索數據庫條目我什麼也沒有提前
如果您正在尋找按日期範圍一個一般使用過濾(如從今天到明天)。 我用這種方式:
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();
}
,當然還有 - 總是有空間在每個代碼中重構。
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));
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();
}
如果我轉換日期爲字符串,然後它顯示我2011-12-11 02:00:00' 如果我減去或添加一個天遂我的查詢不會拉似是而非的結果。通過這種方式,由於時間部分,我將得到指定日期之前那些謊言的條目。 – Rehman
使用適當的日期限制。將所有時間字段(小時,分鐘,秒,毫秒)設置爲0.這使得下限。添加一天。這使得上限。 –