2012-01-23 16 views
7

I timestamp nel database e nell'applicazione ho data. Mi piace scrivere i criteri di ibernazione nel modo in cui l'ibernazione può tirare tutte le voci quelle partite con la data, non la parte del tempo. ad es.Confronta la parte della data della data solo con Timestamp in Hibernate

nel DB timestamp

2011-12-01 15:14:14

e in applicazione io ho java.util.Date che ha da parte di tempo predefinito.

il mio problema è quando cerco le voci dal database con seguente codice ottengo nulla

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

grazie in anticipo

risposta

12

Se siete alla ricerca di un uso generale di filtraggio per intervallo di date (ad esempio, da oggi a domani). Io uso in questo modo:

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

E naturalmente - c'è sempre spazio per refactoring in ogni codice.

4

L'operatore come può essere utilizzato solo su valori stringa. Non ha senso in una data.

Se avete la data 2011-12-01 (supponendo yyyy-MM-dd qui), e si desidera che tutte le righe che hanno la loro timestamp in questo giorno, allora siete alla ricerca di tutte le righe in cui il timestamp è >= 2011-12-01 e < 2011-12-02.

Quindi, aggiungere 1 giorno per la data (utilizzando un oggetto calendario provvisorio), e utilizzare il seguente codice:

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

se converto la data in stringa, quindi mi mostra 2011-12-11 02:00:00 'e se sottrarre o aggiungere un giorno, la mia query non otterrà risultati plausibili. in questo modo otterrò le voci quelle bugie prima del giorno specificato a causa della parte del tempo. – Rehman

+0

Utilizzare i limiti di data appropriati. Imposta tutti i campi di tempo (ore, minuti, secondi, millisecondi) su 0. Questo rende il limite inferiore. Aggiungi un giorno. Questo rende il limite superiore. –

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