自定义订购 MSSQL 休眠 Spring Boot 2

Posted

技术标签:

【中文标题】自定义订购 MSSQL 休眠 Spring Boot 2【英文标题】:Custom ordering MSSQL hibernate Spring boot 2 【发布时间】:2020-04-19 01:58:07 【问题描述】:

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

Q2
Q19
Q120
arandomstring
Q3

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

升序:

Q2
Q3
Q19
Q120
arandomstring

降序:

arandomstring
Q120
Q19
Q3
Q2

请注意,第一个字母已从字段中删除,并且数字被解释为整数。不是文本。

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

是否可以在数据库级别而不是应用程序级别实现这一点?

【问题讨论】:

【参考方案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 子句中使用。要解决此问题,您可能必须先进行子查询,然后再进行排序。

【讨论】:

这对于arandomstring 的第二个订单似乎无法正常工作 @MartinSmith 嗯...没有“第二”顺序,因为单个查询只有一个 ORDER BY 子句。如果 OP 有两个排序要求,他应该在其 Java 代码中保留两个不同的查询。 按列表排序的第二列。即如果主要标准是并列的,则为次要标准 这里可能值得在ORDER BY 的末尾添加Col。如果 OP 有多行不以 'Q' 开头,则行的顺序对它们来说是完全任意的。猜测它们应该按字母顺序排列,但我假设他们确实希望它们排序。 @VinceV。在这里澄清一堆疑问,您是要编写 HQL Hibernate 查询,还是要编写本机 SQL Server 查询,或者您对这两种选择都持开放态度?【参考方案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' 为前缀的值的数字应该存储在与'arandomstring' 列分开的int 列中,没有'Q' 前缀。这意味着问题将变得更加微不足道,因为它只是ORDER BY OriginalColumn, Question(假设'Q' 表示问题)。

【讨论】:

这是一个休眠问题。没有可用的 STUFF 函数,除非 OP 决定使用本机查询(这是完全可能的,但会特别将应用程序代码绑定到 SQL Server)。 没错,但考虑到 OP 已经标记了一个特定的 RDBMS,我假设他们已经这样做了,@TimBiegeleisen。 I was wondering if this is possible with the hibernate API and MSSQL? 也许我无缘无故地挑剔你,但在 Java 方面,使用 Hibernate 的应用程序不是编写本机的SQL,他们正在编写 HQL,并且只能通过本机查询使用 STUFF,而 OP 现在可能想要这样做。 这很公平,@TimBiegeleisen。如果那是 OP 所追求的,我肯定会删除它。他们没有在问题中定义这一点,所以这至少给了他们一个解决方案。如果这是对所需答案的警告,它可能应该由 OP 定义。 (尽管我关于将数值数据存储为数值数据类型的观点是正确的!:))

以上是关于自定义订购 MSSQL 休眠 Spring Boot 2的主要内容,如果未能解决你的问题,请参考以下文章

您如何在休眠条件中订购 oneToMany 连接表

如何在 Spring Boot 1.4 中自定义 Jackson

MSSQL 2014 的错误休眠方言

具有多租户休眠的 Spring-Data JPA

Django Rest 订购自定义

Gradle:带有用于 Spring Boot 的 jvm 参数的自定义任务