gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:26:56 26 4
gpt4 key购买 nike

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

26 4 0
文章推荐: java - 使用 XPath 将元素保留在文本中
文章推荐: java - 为什么在 mongodb 中调用 MongoClient 实例时打开 2 个连接
文章推荐: Java - Set removeAll(Set) 不执行其工作