java - ORDER BY 中的 HQL 案例排序不正确

标签 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,并且它为空,我应该按姓名排序。为此,我使用了:

   (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 时,不是按名称排序。如果我添加 then 并尝试这个:

    (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不为空,也许你可以尝试将结果转换为数字 https://stackoverflow.com/a/2000061/3543153

编辑 1: 使用类似的东西怎么样?

ORDER BY e.studentNumber NULLS LAST, e.student.name NULLS LAST

关于java - ORDER BY 中的 HQL 案例排序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012769/

相关文章:

grails - 如何从Grails中的多对多关系联接表中删除条目

java - with() 和any() 方法做什么?

java - 无法获取 Dbpedia 类的名称

java - 使用显示错误的 hibernate 更新 mysql 表

java - HQL 字符串左侧

java - 表未映射

java - Jersey/web.xml/Servlet 路由问题

java - 警告 : WEB9102: Web Login Failed: com. sun.enterprise.security.auth.login.common.LoginException:

java - Java 日期格式的月份名称的独立形式

java - 使用 HQL 从它们之间具有一对多关系的连接表中进行选择