Java: функция даты JPQL для добавления периода времени к другой дате
SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)
В приведенном выше описании JPQL у SomeClass есть memebr dateAttr
, который является java.util.Date
и имеет аннотацию @Temporal(javax.persistence.TemporalType.DATE)
.
Мне нужен способ сделать бит (CURRENT_DATE + 1 MONTH)
- он явно ошибочен в текущем состоянии, но не может найти документ с функцией даты для JPQL.
Может ли кто-нибудь указать мне в сторону документа, что документы функции даты JPQL (а также как сделать этот конкретный запрос)?
Ответы
Ответ 1
Если у вас есть объект даты, который составляет + 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();
}
Это, однако, требует, чтобы даты были действительными до начала.
UPDATE
Если вы всегда хотите в следующем месяце, вы можете использовать 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();
Ответ 2
Стандартный JPQL не поддерживает такие операции по датам. Вам придется либо использовать собственный запрос, либо выполнить вычисления на стороне Java.
Ответ 3
Или используйте 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, вам либо придется передать параметр, либо использовать собственный именованный запрос
Ответ 4
Dears,
Я использую данные spring, сущность сохраняет createdDate как дату и время, а в репозитории:
@Query(value="SELECT t FROM MyEntity t WHERE t.createdDate Between ?1 and ?2")
public List<MyEntity> findAllBetweenDates(Calendar from, Calendar to);
поэтому я не могу использовать:
setParameter(1,new Date(), TemporalType.DATE
в бэкэнд bean я используйте следующее:
//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);
}
и он отлично работает.