在标准中翻译SQL函数

时间:2015-11-17 13:59:11

标签: java sql hibernate hql hibernate-criteria

我试图将此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();

非常感谢!

1 个答案:

答案 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à!