2015-11-17 34 views
0

我想重现这个SQL查询到一个休眠条件查询我怎么能​​实现这个。在标准中翻译SQL函数

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

事实上,我在这种情况下的问题是,我不知道如何在条件中使用sql函数,我知道条件如何工作,但这个查询是非常棘手的,我不知道如何在条件中重现它=/ – Akyo

+0

好吧,我刚刚提到它现在可以帮助我...? – Akyo

回答

0

所以我去了Hibernate官方论坛,在这里他回答:

嗨akyo

对不起,这是不可能的BE被QBC完成,作为一个老的功能,QBC 不会未来有所改善。

请使用新功能 “JPA标准做”,例如

代码:

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))) 
); 

的Et瞧!