Java: función de la fecha JPQL para añadir un período de tiempo para otra fecha [cerrar]

StackOverflow https://stackoverflow.com/questions/2856386

  •  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)?

¿Fue útil?

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 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top