2010-12-22 24 views
3

嗨 在數據庫中,我們有一個PRSN_ADDRESS表,它有許多地址。用戶在網格中顯示這些地址。要求是先顯示與該用戶狀態相關的地址,然後顯示所有其他狀態。休眠標準按特定狀態排序

例如,表中有10條記錄,其中5條地址的狀態爲Maryland,2個來自PA,3個來自NJ。現在,如果用戶與馬里蘭州相關聯,我們需要顯示所有10個地址,但馬里蘭地址應顯示在前五位,然後按其他順序顯示。

我們正在使用Hibernate標準。我沒有在Formulas上工作,也不確定這是否有助於解決問題。如果有人能指出我的方向是正確的,那將是非常棒的。我很感激。

感謝

哈里什

回答

4

我敢肯定,有待辦事項這真的菜刀的方式,但我最初的想法只是做兩個查詢。首先與state == 'Maryland'和第二state != 'Maryland'。並將結果拼接在一起。

有可能使用HQL:

from Person p order by case when p.addr.state = 'Maryland' then '0' else '1' end asc, p.addr.state asc 

我準備了一個例子在GitHub上

https://github.com/gid79/q4510810-hibernate-criteria-order-by-a-specific-state

+0

非常感謝Gareth。我仍然試圖使用Criteria API獲得解決方案。如果這樣做不能解決問題,我會改用HQL,因爲我以前沒有使用HQL,而且它涉及到對現有代碼的很多更改。欣賞它。 – Harry 2010-12-28 16:17:40

+0

在這種情況下,最簡單的解決方案就是做兩個查詢,該功能將在一個小時內完成。 – 2010-12-28 19:09:05

0

哈里什, 如果我的理解對不對,你將不得不這樣做是添加到標準的順序。 List addresses = sess.createCriteria(PRSN_ADDRESS.class) .addOrder(Order.asc(user.state)) .list();

+0

儘管如此,這不會將用戶的狀態作爲最重要的結果。它只會將用戶的狀態按字母順序排列。 – 2010-12-22 15:56:13

5

您可以通過一個條件值訂購...

(NHibernate的方式,任何人都知道在Hibernate中等價?)

.AddOrder(Order.Asc(
    Projections.Conditional(
     Restrictions.EqProperty("addr.state", "user.state"), Projections.Constant(0), Projections.Constant(1)))) 
.AddOrder(Order.Asc("addr.state")) 

轉換爲...

order by 
    case when addr.state = user.state then 0 else 1 end, 
    addr.state