我试图将此sql查询重现为一个hibernate条件查询,我该如何实现。
SELECT *
FROM PERSON
WHERE
BIRTH_DATE IS NOT NULL
AND (YEAR(GETDATE()) - YEAR(BIRTH_DATE)) in(6,18,26)
ORDER BY
MONTH(BIRTH_DATE) ASC,
DAY(BIRTH_DATE) ASC
在全球范围内,我想要的是让每个年龄在6,18岁和26岁之间的人只按月份和日期订购,以获得未来纪念日清单。
事实上我在这种情况下的问题是我不知道如何在标准中使用sql函数我知道标准是如何工作的但是这个查询非常棘手我不知道怎么做在标准= /
中重现它Criteria criteriaBirthDates = his.getSession().createCriteria(Person.class);
criteriaBirthDates.add(Restrictions.isNotNull("birthdate"));
criteriaBirthDates.addOrder(Order.asc("month(birthdate)"));
criteriaBirthDates.addOrder(Order.asc("day(birthdate)"));
return criteriaBirthDates.list();
非常感谢!
答案 0 :(得分:0)
所以我去了官方的hibernate论坛,答案是:
你好akyo
对不起,作为旧功能,QBC不可能由QBC完成 将来不会改进。
请使用新功能“JPA Criteria”,例如
代码:
CriteriaBuilder cb = this.em.getCriteraBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> person = cb.from(Person.class);
cq
.where(
cb.isNotNull(person.get(Person_.birthDate),
cb.in(
cb.diff(
cb.function("YEAR", cb.function("GETDATE")),
cb.function("YEAR", person.get(Person_.birthDate))
)
)
.value(6, 8, 26)
)
.orderBy(
cb.asc(cb.function("MONTH", person.get(Person_.birthDate))),
cb.asc(cb.function("DAY", person.get(Person_.birthDate)))
);
Etvoilà!