programacion - programar fecha en java
JPA: entidades de retorno que están después de StartDate y antes de EndDate (6)
Está utilizando la condición AND
en su consulta JPA pero solo proporciona un parámetro. Debe usar como findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);
Tengo dos fechas en mi entidad. es decir.
Date startDate;
Date endDate;
¿Cómo hago una consulta para que, dada una fecha, devuelva todas las entidades donde la fecha especificada se encuentre entre startDate
y endDate
?
Ya probé lo siguiente:
findByStartDateAfterAndEndDateBefore(Date givenDate);
Y a Spring-Data-JPA no le gustó esto y se encontró con errores. No hay un error específico y el repositorio simplemente no se puede inyectar a mi clase.
¿Cuál es la manera correcta? Sé que esto se puede hacer fácilmente con criterios de Hibernate o con SQL nativo, pero intentando hacerlo en Spring JPA.
¿Se trata de un problema con la consulta en sí misma o de algún tipo de incompatibilidad entre los tipos de fecha que utiliza Spring?
findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)
y eso devuelve null.
Lo uso sin problemas como este:
findAllByEntityNotNullAndDateBetween(Date begin, Date end);
¿Ya lo has probado?
No puede usar un solo parámetro debido a las restricciones de los Datos de Spring, pero puede solucionarlo usando un código como este:
List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);
default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}
Este código debe cubrir sus necesidades. También lo verifiqué con Spring Boot 1.5.9. usando el ejemplo de spring-data-get-started .
Para mi sorpresa, LessThan
y GreaterThan
trabajando y Before
y After
fallando mal.
Nunca pensé que puedo usar menos que y más que para las fechas y siempre veo funciones relacionadas con la fecha como entre, antes, después.
Esto se debe principalmente al ejemplo de documentación.
After
findByStartDateAfter
… where x.startDate > ?1
Before
findByStartDateBefore
… where x.startDate < ?1
Así que miré más de cerca los documentos de Spring Data JPA y encontré algo interesante con el siguiente ejemplo.
LocalDate date = new LocalDate().minusYears(2);
return builder.lessThan(root.get(_Customer.createdAt), date);
Entonces, al comparar los tiempos de los autores, los autores usan los criterios menos para la propiedad del tiempo.
Así que se le dio un tiro con menos de y funcionó y nuevamente se dio un tiro con más de un pozo y más tarde juntos. Así que llegué a una conclusión
public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate);
Y esto está funcionando hasta ahora. Y creo que debe haber una manera limpia de manejar las fechas probablemente before,after,between
pero simplemente no puedo entender eso.
Sería genial si alguien se da cuenta de eso.
Ya que solo necesita el objeto Date como equivalente de LocalDate, esto debería hacer el truco.
default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
Calendar cal = Calendar.getInstance();
cal.setTime(endDate);
cal.add(Calendar.DATE, -1);
return findByStartDateBetween(startDate, cal.getTime());
}
Debido a que desea que incluya el inicio, pero no el final, y SQL BETWEEN
es inclusivo, solo retrocedemos el día.
Public List<EntityClass> findData(Date startDate,Date endDate)
{
Query<EntityClass> _q = em.createQuery("select a.* from _tableName a
where a.startDate>= :d1 AND a.endDate<= :d2");
_q.setParameter("d1", startDate, TemporalType.DATE);
_q.setParameter("d2", endDate, TemporalType.DATE);
List<EntityClass> result = query.getResultList();
em.getTransaction().commit();
return result;
}