Java: дата JPQL функционирует для добавления периода времени к другой [закрытой] дате

SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)

В вышеупомянутом операторе JPQL SomeClass имеет участника dateAttr, который является a java.util.Date и имеет a @Temporal(javax.persistence.TemporalType.DATE) аннотация.

Мне нужен способ сделать (CURRENT_DATE + 1 MONTH) бит - это, очевидно, неправильно в своем текущем состоянии - но не может найти документ с функцией даты для JPQL.

Кто-либо может указать на меня в направлении документа, что документы функции даты JPQL (и также как сделать этот конкретный запрос)?

26
задан Peter Lang 18 May 2010 в 10:55
поделиться

3 ответа

Если у вас есть объект даты, который уже равен +1 месяцу, вы можете сделать что-то вроде этого:

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

Это, однако, требует, чтобы даты были действительны заранее.

ОБНОВЛЕНИЕ

Если вам всегда нужен следующий месяц, вы можете использовать JodaTime , у которого есть отличный и простой API. Затем вы можете изменить свой запрос следующим образом:

//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();
18
ответ дан 28 November 2019 в 07:27
поделиться

Или используйте commons-lang вместо 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();

Но я знаю, что это не то, о чем вы спрашиваете, и я почти уверен, что это невозможно сделать только в JPQL, вы будете необходимо либо передать параметр, либо использовать собственный именованный запрос

5
ответ дан 28 November 2019 в 07:27
поделиться

Стандартный JPQL не поддерживает такие операции с датами. Вам придется либо использовать собственный запрос, либо выполнять вычисления на стороне Java.

18
ответ дан 28 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: