sql – 存储库 – 在本机查询中的顺序无效

前端之家收集整理的这篇文章主要介绍了sql – 存储库 – 在本机查询中的顺序无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个spring数据JPA存储库(在postgres数据库上),有时我需要使用nativeQuery = true选项使用本机查询.

但是在我目前的情况下,我需要传递一个订单字段,我这样做:

电话..

targetStatusHistoryRepository.findSirenAlarmTimeActivation([uuid,uuid2],"activation_name DESC",10)

..回购方法

@Query(
        nativeQuery = true,value = """select
                     a.name as activation_name,min(transition_from_active_in_millis),max(transition_from_active_in_millis),avg(transition_from_active_in_millis) from target_status_history t,activation_scenario a
                     where t.activation_uuid=a.activation_scenario_id and t.transition_from_active_in_millis > 0 and t.activation_uuid in (:activationUUIDs) group by a.name,t.activation_uuid
                     order by :orderClause offset :offset limit :limit """
)
List<Object[]> findSirenAlarmTimeActivation(@Param("activationUUIDs") List<UUID> activationUUIDs,@Param("orderClause") String orderClause,@Param("offset") int offset,@Param("limit") int limit )

我用DESC写了一个单元测试,然后用ASC调用,反之亦然,看起来第一个调用是第二个,第二个给出相同的结果.

解决方法

如果这是一个准备好的语句,并且这是在ORDER BY子句中提供的绑定值,那么这是有效的,但是……

提供的绑定值不会被解释为sql文本.也就是说,该值将被视为一个值(如文字字符串).它不会被视为列名或ASC或DESC关键字.

在语句的上下文中,为:orderClause绑定占位符提供一个值,这与您编写ORDER BY’some literal’的效果相同.

而且根本没有对行进行任何排序.

(至少在我用于DB2,Teradata,Oracle,sql Server,MysqL和MariaDB的每个sql客户端库中都是如此(JDBC,Perl DBI,ODBC,Pro / C等)

(MyBatis确实提供了一种方便的机制,用于在sql文本中进行变量替换,在准备之前动态更改sql文本,但是这些替换是在语句准备之前处理的,并且不会在语句中变成绑定占位符.)

在ORDER BY子句中可以使用一些精心设计的表达式来获得一些“动态”排序.例如,我们可以使用我们的静态sql文本:

ORDER BY CASE WHEN :sort_param = 'name ASC'  THEN activation_name END ASC,CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC

(这里的sql文本不是动态的,它实际上是静态的,就像我们写的一样.

ORDER BY expr1 ASC,expr1 DESC

“技巧”是ORDER BY子句中的表达式有条件地从每一行返回某个列的值,或者它们返回一个文字(在上面的示例中,文字为NULL),具体取决于绑定的值值,在执行时评估.

实际效果是我们可以“动态”获得以下任何一种效果

ORDER BY activation_name ASC,NULL DESC

要么

ORDER BY NULL ASC,activation_name DESC

要么

ORDER BY NULL ASC,NULL DESC

取决于我们为:sort_param占位符提供的值.

原文链接:https://www.f2er.com/mssql/83281.html

猜你在找的MsSQL相关文章