我有一个spring数据JPA存储库(在postgres数据库上),有时我需要使用nativeQuery = true选项来使用本机查询。
然而,在我目前的情况下,我需要传入一个订单字段,并像这样做:
电话..
targetStatusHistoryRepository.findSirenAlarmTimeActivation([uuid,uuid2],"activation_name DESC", 0, 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调用编写了一个单元测试,反之亦然,看起来无论第一次调用是什么,第二次都给出了相同的结果。
4条答案
按热度按时间2cmtqfgy1#
如果这是一个准备好的语句,并且这是在
ORDER BY
子句中提供的绑定值,那么这是有效的,但是…提供的bind值不会被解释为SQL文本。也就是说,该值将被视为只是一个值(如文字字符串)。它不会被视为列名或
ASC
或DESC
关键字。在语句的上下文中,为
:orderClause
绑定占位符提供一个值,这将与编写ORDER BY 'some literal'
具有相同的效果。这并没有对行进行任何排序。
(This至少在我用于DB2、Teradata、Oracle、SQL Server、MySQL和MariaDB(JDBC、Perl DBI、ODBC、Pro/C等)的每个SQL客户端库中都是如此。
(MyBatis确实提供了一种方便的机制,用于在SQL文本中进行变量替换,在准备之前动态更改SQL文本,但这些替换在准备语句之前进行处理,并且不会在语句中变成绑定占位符。
在ORDER BY子句中使用一些精心设计的表达式可以获得一些“动态”排序。例如,我们可以让我们的静态SQL文本如下所示:
(The这里的SQL文本不是动态的,它实际上是静态的,就像我们写的一样。
“技巧”是ORDER BY子句中的表达式有条件地返回每行中某个列的值,或者返回一个文字(在上面的示例中,文字NULL),这取决于执行时计算的绑定值的值。
净效果是我们可以“动态地”获得以下任一效果:
或
或
这取决于我们为:sort_param占位符提供的值。
0g0grzrc2#
您可以在SpEL语言中使用pageable。
Pageable
中的Sort
对象将用于在请求的末尾追加" order by "
。Here就是一个例子。nfs0ujit3#
使用createNativeQuery并直接将值作为字符串追加到查询中,而不是使用setParameter()。
ccgok5k54#
我在Sping Boot 中使用原生查询时遇到了同样的问题,我发现的方法是:
1-创建可分页:
2-在查询中添加“
ORDER BY true
”,例如: