首页 > 解决方案 > hql CASE WHEN 不能多次使用

问题描述

我需要在 hql 查询中为 order by 设置条件。

  1. 排序依据(列名)
  2. 排序顺序(升序或降序)

在我的 hql 查询中有 3 个表加入

select a from TableA a, TableB b, TableC c WHERE a.column1 = b.column2 AND b.column1 = c.column2 ORDER BY CASE WHEN :sortBy = column3 THEN a.column3 WHEN :sortBy = column4 THEN b.column4 ELSE c.column5 END CASE WHEN :sortOrder = 'asc' THEN asc ELSE desc END

在此查询中,第二个CASE WHEN条件出现错误

我也通过以下查询尝试过

select a from TableA a, TableB b, TableC c WHERE a.column1 = b.column2 AND b.column1 = c.column2 ORDER BY CASE WHEN :sortBy = column3 THEN (CASE WHEN :sortOrder = 'asc' THEN 'a.column3 asc' ELSE 'a.column3 desc' END) WHEN :sortBy = column4 THEN (CASE WHEN :sortOrder = 'asc' THEN 'b.column4 asc' ELSE 'b.column4 desc' END) ELSE (CASE WHEN :sortOrder = 'asc' THEN 'c.column5 asc' ELSE 'c.column5 desc' END) END

在此查询中,响应未排序

你能指导我这个查询有什么问题吗?

标签: mysqlspringhql

解决方案


子句中的CASE表达式ORDER BY需要用逗号分隔。但是,您似乎希望能够根据参数选择排序方向:sortOrder。一种方法是与生成升序和降序的CASE表达式相乘。1.0-1.0

SELECT a from TableA a, TableB b, TableC c
WHERE a.column1 = b.column2 AND b.column1 = c.column2
ORDER BY
    (CASE WHEN :sortOrder = 'asc' THEN 1.0 ELSE -1.0 END) *
    CASE WHEN :sortBy = column3 THEN a.column3
         WHEN :sortBy = column4 THEN b.column4
         ELSE c.column5 END;

推荐阅读