2012-01-23 10 views
7

Mam znacznik czasu w bazie danych iw aplikacji mam datę. Lubię pisać kryteria hibernacji w taki sposób, że hibernacja może przeciągnąć wszystkie wpisy, które pasują do daty, a nie część czasu. np.Porównaj datę Data część tylko z sygnaturą czasową w Hibernate

w DB datownik

2011-12-01 15:14:14

iw aplikacji mam java.util.Date, który ma po części domyślnego czasu.

moim problemem jest to, kiedy wyszukiwać wpisy z bazy danych z następujący kod otrzymuję nic

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

góry dzięki

Odpowiedz

12

Jeśli szukasz ogólnego użytku filtrowania według zakresu dat (np od dziś do jutra). używam go w ten sposób:

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(); 
} 

i oczywiście - zawsze jest miejsce na refaktoryzacja w każdym kodzie.

4

Operator jak mogą być wykorzystane wyłącznie na wartościach Smyczkowych. To nie ma sensu na randce.

Jeśli masz datę 2011-12-01 (zakładając yyyy-MM-dd tutaj), a chcesz wszystkie wiersze, które mają swój znacznik czasu w tym dniu, a następnie szukasz wszystkich wierszy, gdzie datownik jest >= 2011-12-01 i < 2011-12-02.

Tak, dodać 1 dzień datą (za pomocą tymczasowy obiekt kalendarz) i użyć następującego kodu:

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

jeśli konwertuję datę na ciąg, to pokazuje mi 2011-12-11 02:00:00 ', a jeśli odejmę lub dodaję jeden dzień, to moje zapytanie nie będzie dawać wiarygodnych wyników. w ten sposób otrzymam wpisy kłamstw przed określonym dniem z powodu części czasu. – Rehman

+0

Użyj odpowiednich limitów dat. Ustaw wszystkie pola czasu (godziny, minuty, sekundy, milisekundy) na 0. To powoduje, że dolna granica. Dodaj jeden dzień. To sprawia, że ​​górna granica. –

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(); 
} 
Powiązane problemy