Consulta JPA para el día ignorando la hora

Supongamos que tiene una clase con un campo java.util.Date. Tal vez una clase de tareas pendientes o una clase de planificación de eventos.

@Temporal(TemporalType.TIMESTAMP)
private Date startTime;

Esto se asignará a una columna de fecha y hora en MySQL.

Hay casos de uso en los que desea saber con precisión cuándo ocurre este evento. "¿Qué está programado para el 11 de agosto de 2011 a las 8 pm?"

A veces, solo desea saber qué eventos están planificados para una fecha específica. "¿Qué está programado para el 11 de agosto de 2011?"

Si su JPAQL es:

SELECT blah blah etc. WHERE ti.startTime = :d1

y el parámetro es una instancia java.util.Date:

query.setParameter("d1", date, TemporalType.DATE);

sus resultados estarán restringidos por la fecha, pero también el tiempo.

Este es un caso de uso tan común que me sorprende que no haya una forma sencilla de hacer esto incluso en JPA 2.0.

Prefiero no usar un truco específico de un proveedor ni jugar con cadenas / subcadenas.

¿Cómo ha resuelto este problema?

preguntado el 27 de agosto de 11 a las 18:08

2 Respuestas

Sé que llego un poco tarde, pero encontré una manera de hacerlo. Estaba usando un jpql como este:

select s from S s where date(s.someDate) = :param

Y configuro el parámetro con:

query.setParameter("param", param, TemporalType.DATE);

La forma que encontré para hacer esto con Criteria Query fue:

builder.equal(
 builder.function("date", Date.class, root.get(S_.someDate)), 
 param
);

Al menos, con MySql funciona.

Espero que pueda ayudar.

respondido 22 nov., 12:17

select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay

es una solución relativamente fácil de implementar y funciona en cualquier implementación de JPA.

Hibernate también permite agregar funciones a un dialecto para generar SQL personalizado.

Respondido 27 ago 11, 22:08

Gracias por la respuesta. Eso es casi lo que estoy haciendo: pero estoy usando BETWEEN. Funciona, pero me preguntaba si hay una forma más eficiente. - Gene De Lisa

Si tiene un índice en startTime, debe ser bastante eficiente. El uso de una función SQL para extraer la parte de la fecha necesitaría un índice en la función para ser eficiente. Tenga en cuenta que entre es inclusivo:> = y <= en lugar de> = y <. - JB Nizet

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.