Java: función de la fecha JPQL para añadir un período de tiempo para otra fecha [cerrar]
-
27-09-2019 - |
Pregunta
SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)
En la declaración anterior JPQL, SomeClass tiene una dateAttr
memebr, que es un java.util.Date
y tiene una anotación @Temporal(javax.persistence.TemporalType.DATE)
.
Necesito una manera de hacer el bit (CURRENT_DATE + 1 MONTH)
- es obviamente erróneo en su estado actual - pero no puedo encontrar el documento con la función fecha para JPQL
me puede punto cualquiera en la dirección de un documento que documentos JPQL funciones de fecha (y también cómo hacer esta consulta en particular)?
Solución
Si usted tiene un objeto de fecha que es + 1 mes de que ya se podí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();
}
Sin embargo, esto requiere que las fechas sean válidas antes de la mano.
Actualizar
Si siempre quiere que el próximo mes, se puede utilizar JodaTime que tiene una gran y fácil api. A continuación, puede modificar su consulta como la siguiente:
//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();
Otros consejos
Estándar JPQL no soporta este tipo de operaciones en las fechas. Usted tendrá que utilizar una consulta nativa o hacer el cálculo en el lado de Java.
O bien, utilizar 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án pidiendo y estoy bastante seguro de que no puede hacerse en JPQL solo, que o bien tienen que pasar un parámetro o utilizar una llamada de consulta ??p> nativa
queridos,
Estoy usando los datos de la primavera, la entidad guardar el CreatedDate como fecha y hora, y en el repositorio de la siguiente 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 grano backend i utilizar 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.