2012-07-03 47 views
0

我有一个班级具有出生日期变量的用户,并且我正在尝试编写一个标准查询来查找所有超过X岁且小于Y的用户,其中X和Y是两个整数,出生日期是日期。休眠条件从出生当天的年龄范围搜索

我使用这个表达式解决了这个问题,但我想避免使用Expression,因为我猜它只能用于MySQL。

.createCriteria(User.class) 
.add(Expression 
     .sql("DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(BIRTHDATE)) , '%Y') >= " + lowAge)) 
.add(Expression 
     .sql("DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(BIRTHDATE)) , '%Y') <= " + highAge)) 

任何想法?

回答

1

你可以用Restrictions代替吗?

.createCriteria(User.class) 
.add(Restrictions.ge("birthdate", lowAge)) 
.add(Restrictions.le("birthdate", highAge)) 

birthdate是出生场为您User类的日期。

+0

我编辑我的第一篇文章。我不能,因为lowAge是一个整数,生日是一个日期。 – LorenzoR

+0

难道你不能将年龄转换为生日吗?应该像'Calendar.getInstance()。add(Calendar.YEAR,-1 * lowAge).getTime()'或其他东西一样简单。或者在数据库中没有进行计算时出现语言环境问题? –

2

这是一个古老的问题。 但是今天我以这种方式解决,可能是有人更有益:

Criteria=cri=session.createCriteria(YourClass.class); 
Conjunction conj=Restrictions.conjunction(); 
Calendar cal=Calendar.getInstance(); 
cal.add(Calendar.YEAR,(-1*age)); 
Date birthEnd=cal.getTime(); 
cal.add(Calendar.YEAR,-1); 
Date birthStart=cal.getTime(); 
conj.add(Restrictions.gt("birthdayAttributeName", birthStart)); 
conj.add(Restrictions.le("birthdayAttributeName", birthEnd)); 
disj.add(conj);