有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java定制订购MSSQL hibernate Spring boot 2

我正在通过规范实现一个select查询,该规范查询大部分时间以Q开头的列表的结果。例如:

Q2
Q19
Q120
arandomstring
Q3

我想按照以下规则对列表进行排序:

升序:

Q2
Q3
Q19
Q120
arandomstring

降序:

arandomstring
Q120
Q19
Q3
Q2

请注意,第一个字母从字段中去掉,数字被解释为整数。不作为文本

我想知道hibernate规范API和MSSQL是否可以做到这一点?我发现在MSSQL(https://sqlandme.com/2013/11/18/sql-server-custom-sorting-in-order-by-clause/)中已经有类似于自定义排序顺序的东西,但在hibernate文档中,我还没有找到任何东西

是否可以在数据库级别而不是应用程序级别实现此功能


共 (2) 个答案

  1. # 1 楼答案

    下面是一个可以正常工作的原始SQL Server查询:

    SELECT *
    FROM yourTable
    ORDER BY
        CASE WHEN col LIKE 'Q%' THEN 0 ELSE 1 END,
        CASE WHEN col LIKE 'Q%' THEN CAST(SUBSTRING(col, 2, LEN(col)) AS INT) ELSE 0 END;
    

    Demo

    就让这个查询在Hibernate中工作而言,除了SUBSTRING不能在ORDER BY子句中使用之外,它的大部分映射都没有任何问题。要解决这个问题,您可能需要先进行子查询,然后再进行排序

  2. # 2 楼答案

    这不太理想;如果您的值应被视为数字数据,则应将其存储为数字值

    无论如何,您可以使用STUFF删除第一个字符,并使用TRY_CONVERT数字数据类型删除值:

    ORDER BY CASE WHEN TRY_CONVERT(int,STUFF(YourColumn,1,1,'')) IS NULL THEN 1 ELSE 0 END,
             TRY_CONVERT(int,STUFF(YourColumn,1,1,'')),
             YourColumn;
    

    理想情况下,如果需要存储数值数据,并且(更重要的是)将其视为数值数据,则应使用数值数据类型。在这里,前缀为'Q'的值的数字似乎应该存储在一个单独的int列中,而不是具有'arandomstring'前缀的列中。这将意味着问题将变得更加琐碎,因为它只是ORDER BY OriginalColumn, Question(假设'Q'表示问题)