ORDER BY中的HQL案例未正确排序

时间:2016-06-24 11:50:01

标签: java hql

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

与上述相同,两种情况都是如此。

1 个答案:

答案 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