jpa 存储库-本机查询中的排序依据不起作用

6tqwzwtp  于 2023-04-12  发布在  其他
关注(0)|答案(4)|浏览(216)

我有一个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调用编写了一个单元测试,反之亦然,看起来无论第一次调用是什么,第二次都给出了相同的结果。

2cmtqfgy

2cmtqfgy1#

如果这是一个准备好的语句,并且这是在ORDER BY子句中提供的绑定值,那么这是有效的,但是…
提供的bind值不会被解释为SQL文本。也就是说,该值将被视为只是一个值(如文字字符串)。它不会被视为列名或ASCDESC关键字。
在语句的上下文中,为: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文本如下所示:

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

(The这里的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占位符提供的值。

0g0grzrc

0g0grzrc2#

您可以在SpEL语言中使用pageable。Pageable中的Sort对象将用于在请求的末尾追加" order by "Here就是一个例子。

nfs0ujit

nfs0ujit3#

使用createNativeQuery并直接将值作为字符串追加到查询中,而不是使用setParameter()。

ccgok5k5

ccgok5k54#

我在Sping Boot 中使用原生查询时遇到了同样的问题,我发现的方法是:
1-创建可分页:

Pageable pageable = PageRequest.of(numPage, sizePage, Sort.by(direction , nameField));

2-在查询中添加“ORDER BY true”,例如:

@Query(value = " SELECT  * " +
            "FROM articulos a   " +
            "WHERE " +            
            "AND a.id = :id" +           
            "ORDER BY TRUE",
        countQuery = " SELECT  * " +
            "FROM articulos a   " +
            "WHERE " +            
            "AND a.id = :id" +           
            "ORDER BY TRUE"
        , nativeQuery = true)
    Page<PrecioArticuloVO> obtenerPreciosPorCategoriaProveedor(@Param("id")Long id,Pageable pagina);

相关问题