2012-01-23 13 views
7

Tengo la marca de tiempo en la base de datos y en la aplicación tengo fecha. Me gusta escribir criterios de hibernación en la forma en que hibernate puede extraer todas las entradas de esas coincidencias con fecha, no con parte de tiempo. p.Compare la fecha de la fecha solo con Timestamp en Hibernate

en el PP marca de tiempo

2011-12-01 15:14:14

y en aplicación i tienen java.util.Date que tiene por parte de tiempo predeterminado.

mi problema es cuando busco las entradas de base de datos con código siguiente me sale nada

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

gracias de antemano

Respuesta

12

Si usted está buscando un uso general de filtrar por rango de fechas (por ejemplo, desde hoy hasta mañana). lo uso de esa manera:

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

Y, por supuesto - siempre hay espacio para refactorización en cada código.

4

el operador LIKE sólo se puede utilizar en valores de cadena. No tiene sentido en una fecha.

Si usted tiene la fecha 2011-12-01 (suponiendo yyyy-MM-dd aquí), y desea que todas las filas que tienen su marca de tiempo en el día de hoy, entonces usted está en busca de todas las filas en las que la marca de tiempo es >= 2011-12-01 y < 2011-12-02.

Por lo tanto, añadir 1 día a la fecha (utilizando un objeto Calendar temporal), y use el siguiente código:

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

Cuando se modifica la fecha de cadena, entonces me demuestra 2011-12-11 02:00:00' y si le resto o añadir una día, entonces mi pregunta suele tirar de resultados plausibles. de esta manera obtendré entradas de esas mentiras antes del día especificado debido a la parte de tiempo. – Rehman

+0

Utilice los límites de fecha adecuados. Establezca todos los campos de tiempo (horas, minutos, segundos, milisegundos) en 0. Eso hace que el límite inferior. Agrega un día Eso hace que el límite superior. –

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