自定义订购 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的主要内容,如果未能解决你的问题,请参考以下文章