para - sumar dias a una fecha java
Java: función de fecha JPQL para agregar un período de tiempo a otra fecha (4)
SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)
En la declaración JPQL anterior, SomeClass tiene un memebr dateAttr
, que es un java.util.Date
y tiene una @Temporal(javax.persistence.TemporalType.DATE)
.
Necesito una forma de hacer el bit (CURRENT_DATE + 1 MONTH)
, obviamente está mal en su estado actual, pero no puedo encontrar el documento con la función de fecha para JPQL.
¿Alguien puede indicarme la dirección de un documento que documenta las funciones de fecha de JPQL (y también cómo hacer esta consulta en particular)?
JPQL estándar no admite tales operaciones en las fechas. Tendrá que usar una consulta nativa o realizar el cálculo en el lado de Java.
O use commons-lang en lugar de jodatime:
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2"
)
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,DateUtils.addMonths(new Date(), 1), TemporalType.DATE)
.getResultList();
Pero sé que esto no es lo que estás preguntando y estoy bastante seguro de que no se puede hacer solo en JPQL, tendrás que pasar un parámetro o usar una consulta con nombre nativo
Queridos,
Estoy usando datos de Spring, la entidad guarda la fecha de creación como fecha y hora, y en el repositorio de esta manera:
@Query(value="SELECT t FROM MyEntity t WHERE t.createdDate Between ?1 and ?2")
public List<MyEntity> findAllBetweenDates(Calendar from, Calendar to);
así que no puedo usar:
setParameter(1,new Date(), TemporalType.DATE
En el bean backend utilizo lo siguiente:
//to set zero of hours,minutes,seconds and milliseconds
fromCalendar.set(java.util.Calendar.HOUR, 0);
fromCalendar.set(java.util.Calendar.MINUTE, 0);
fromCalendar.set(java.util.Calendar.SECOND, 0);
fromCalendar.set(java.util.Calendar.MILLISECOND, 0);
toCalendar.set(java.util.Calendar.HOUR, 0);
toCalendar.set(java.util.Calendar.MINUTE, 0);
toCalendar.set(java.util.Calendar.SECOND, 0);
toCalendar.set(java.util.Calendar.MILLISECOND, 0);
// add 1 days and decrease 1 millisecond
toCalendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
toCalendar.add(java.util.Calendar.MILLISECOND, -1);
allEntities = myEntityRepository.findAllBetweenDates(fromCalendar, toCalendar);
}
y está funcionando bien.
Si ya tiene un objeto de fecha que es + 1 mes, podría hacer algo como esto:
public List findEmployees(Date endDate) {
return entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,endDate, TemporalType.DATE).getResultList();
}
Esto sin embargo, requiere que las fechas sean válidas de antemano.
ACTUALIZAR
Si siempre desea el próximo mes, puede usar JodaTime, que tiene una api excelente y fácil. A continuación, podría modificar su consulta de esta manera:
//Get next month
DateTime dt = new DateTime();
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,dt.plusMonths(1).toDate(), TemporalType.DATE).getResultList();