variable una sumar para obtener ingresar gregorian funcion fecha dias declarar atributo java date documentation jpql

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