我有一个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

09-11 22:20