我有一个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)
在两种情况下都与上述相同。
最佳答案
我认为这是SQL错误。在“案例”中,您将返回两个不同的数据类型,sql将自动广播数字类型以满足某种逻辑。
我尝试在oracle数据库中执行类似的操作,并导致一个错误,指出返回的数据类型不同。
您应该尝试更改您的请求。如果studentNumber不为null,也许可以尝试将结果转换为数字
https://stackoverflow.com/a/2000061/3543153
编辑1:
关于使用类似的东西怎么办
ORDER BY e.studentNumber NULLS LAST, e.student.name NULLS LAST