代码之家  ›  专栏  ›  技术社区  ›  KnechtRootrecht

HQL自定义订单ASC和DESC

  •  1
  • KnechtRootrecht  · 技术社区  · 7 年前

    我有以下情况:

    我有一张一年的账单(例如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(按案例排序…)实现我的目标但我不知道如何根据值以不同的方式排列同一行。 Like:(这不起作用)

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

    提前感谢您的帮助。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Biegeleisen    7 年前

    尝试此查询:

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

    这是通过首先将未付账单记录放在已付记录之前来实现的。对于第一个排序条件,我们不需要使用case表达式,因为 false 之前排序 true . 对于年度订单,我们确实需要一个case表达式。在这里,我们对未付账单按年度升序排序,对已付账单按年度降序排序。