Мне нужно выбрать данные с заявлением, где я сравниваю даты. Запрос 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