2012-07-03 46 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);