Как сравнивать даты в Criteria API - PullRequest
1 голос
/ 25 февраля 2020

Мне нужно выбрать данные с заявлением, где я сравниваю даты. Запрос SQL выглядит так:

select c.candidate_id
from candidate c
         left join experience e on c.candidate_id = e.candidate_id
group by c.candidate_id
having (sum(datediff(e.end_working_date, e.start_working_date)) > 365)
   and (sum(datediff(e.end_working_date, e.start_working_date)) <= (365 * 3));

Но я не знаю, как написать этот код с помощью Criteria API. Я не могу сопоставить java.util.Date с sql timestamp SQL функцией, и я получаю NPE. Мой объект Experience

public class ExperienceEntity {
   ...
   @Column(name = "start_working_date")
   @Temporal(TemporalType.TIMESTAMP)
   private Date startWorkingDate;

   @Column(name = "end_working_date")
   @Temporal(TemporalType.TIMESTAMP)
   private Date endWorkingDate;
   ...
}

И мой запрос в Criteria API

 Expression<Date> endWorkingDate = experienceRoot.get("endWorkingDate");
 Expression<Date> startWorkingDate = experienceRoot.get("startWorkingDate");
 Expression<Integer> dateDiffFunc = builder.function("datediff", Integer.class, endWorkingDate, startWorkingDate);
 select.groupBy(root.get("candidateId"));

 select.having(builder.and(
                            builder.gt(builder.sum(dateDiffFunc), 365),
                            builder.le(builder.sum(dateDiffFunc), 365 * 3)
                    ));

datediff - это пользовательская функция для получения дней при вычитании endWorkingDate и startWorkingDate

...