2014-09-26 37 views
2

我有一個彈簧數據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

如果這是一份聲明中,這就是ORDER BY子句中提供的綁定值,即是有效的,但是......提供

綁定值不會被解釋爲SQL文本。也就是說,該值將被視爲一個值(如文字字符串)。它不會被視爲列名稱,或ASCDESC關鍵字。

在聲明的上下文中,爲:orderClause綁定佔位符提供一個值,這與您寫入ORDER BY 'some literal'的效果相同。

而這根本就沒有做任何排序的行。

(至少在我用於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 

(這裏的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佔位符。

+0

我給它一個去,但限制和抵消參數呢?我能在那裏做什麼 – 1977 2014-09-28 15:44:00

+0

好,它的工作原理,沒有限制或抵消的問題。多謝,夥計 – 1977 2014-09-28 15:59:59

0

您可以在SpEL語言中使用可換頁。 Pageable中的Sort對象將用於在請求結束時追加" order by "Here就是一個例子。