HQL自定义顺序ASC和DESC

时间:2018-01-26 09:27:32

标签: sql-order-by hql

我有以下情况:

我有一年的账单(例如2000年,2001年......),一个布尔表示账单是否已付款以及其他不同的值如人名。

我希望以特定顺序在列表中显示它们。最老的未付帐单应该在最顶层,最早的付费帐单应该在底部。它也应该按名称排序。 像:

Name   Year  PAID
Smith  2010  false
Otto   2018  false
Anon   2018  true
Hueue  2018  true
Otto   2017  true
Smith  2009  true

像这样......

"from Bill as b order by b.paid, b.year, b.name"

此子句对列表进行排序,如:

Name   Year  PAID
Smith  2010  false
Otto   2018  false
Smith  2009  true
Otto   2017  true
Anon   2018  true
Hueue  2018  true

我试图用HQL实现我的目标(按个案排序......)但我不知道如何根据值以不同方式订购同一行。 喜欢:(这不起作用)

" from Bill as b" +
" order by" +
" b.paid," +
" (case b.year" +
"   WHEN b.paid" +
"   THEN b.year" +
"   ELSE -b.year" +
" end)," +
" b.name"

提前感谢您的帮助。

编辑:添加了更多解释和示例...

1 个答案:

答案 0 :(得分:1)

尝试此查询:

from Bill as b
order by
    b.paid,
    case when b.paid = 'false' then b.year else -b.year end,
    b.name

首先在付费记录之前放置未付帐单记录。对于第一个排序条件,我们不需要使用case表达式,因为falsetrue之前排序。对于年份订单,我们需要一个案例表达式。在这里,我们按年计算未付账单的递增和按付账单递减。