我有一个HQL,我可以选择按“studentNumber”或其名称订购。
String orderBy = orderByNumber
? "(case when e.studentNumber is null then e.student.name else e.studentNumber end)" : "e.student.name";
但是如果我选择studentNumber,并且它为null,我应该按名称排序。为此我用过:
(case when e.studentNumber is null then e.student.name else e.studentNumber end)
这种方法很好,但是当我有超过10名学生时,订单就是这样:
1
10
11
12
2
3
4
5
6
7
8
9
studentNumber
在数据库和实体中设置为Integer。我想如果它被认为是一个字符串就会发生这种情况。
谢谢
编辑1 我尝试了这个新查询:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) end)
现在它正确排序,但是当e.studentNumber为null时,不按名称排序。如果我添加然后尝试这个:
(case when (case when e.studentNumber is null then e.student.name else e.studentNumber end) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
第一个问题是作为一个僵尸(1,10,2,3)从死者身上回来......
编辑2
我也尝试过合并:
(case when coalesce(e.studentNumber, e.student.name) = e.studentNumber then cast(e.studentNumber as int) else e.student.name end)
与上述相同,两种情况都是如此。
答案 0 :(得分:3)
我认为这是一个SQL错误。在" Case"你正在返回两种不同的数据类型,sql自动进行数字类型以满足某种逻辑。 我尝试在oracle数据库中做类似的事情,它会导致一个错误,表示返回的数据类型是不同的。 您应该尝试更改您的请求。如果studentNumber不为null,也许您可以尝试将结果转换为数字 https://stackoverflow.com/a/2000061/3543153
编辑1: 关于使用像
这样的东西的简单方法ORDER BY e.studentNumber NULLS LAST, e.student.name NULLS LAST