2010-09-01 70 views
16

我想寫一個JPQL查詢使用ORDER BY子句子句:JPQL ORDER BY與參數

query = "SELECT c FROM item ORDER BY c.name ASC" 

我想設置一個「秩序」的參數,它的值是不是「ASC」或 「降序」:

query = "SELECT c FROM item ORDER BY c.name :order" 

然後在我的實現:

query.setParameter("order", "ASC"); 

這是當我得到一個休眠錯誤:

org.hibernate.HibernateException: Errors in named queries 

任何想法,我做錯了什麼?謝謝!

回答

17

「ASC」或「DESC」不能是查詢參數。你可以使用字符串連接。

query = "SELECT c FROM item ORDER BY c.name " + sortOrder; 

您應該驗證的sortOrder內容只能是ASC或DESC,不直接從用戶來的。

+1

OK,說明了很多。無論如何,在@NamedQuery的聲明中使用字符串連接? – 2010-09-01 08:52:37

+0

好的,謝謝! – 2010-09-01 09:40:44

7

如果你想在這裏使用命名查詢,你需要兩個命名查詢(命名查詢是靜態的,你不能使用ASC和DESC作爲@Mark指出的參數)。

+0

或者我想我可以只使用動態查詢? – 2010-09-01 12:43:30

+0

@Pedro當然。但這不會是@NamedQuery(我實際上正在回答你的評論之一)。 – 2010-09-01 13:19:57

+0

你是對的。但事實是,我有很多命名查詢需要排序,因此爲每個查詢創建2個查詢會導致兩倍的命名查詢。那是問題嗎?或者我應該使用動態查詢嗎? – 2010-09-01 13:36:40

5

而是寫作的兩次「由序」條款包含了一個名爲查詢,你可以實現你的DAO是這樣的:

public List<MyEntity> findByAttribute(boolean desc,...){ 
    TypedQuery<MyEntity> q = em.createNamedQuery(... 
    q.setParameter(... 
    List<MyEntity> result = q.getResultList(); 
    if(desc){ 
     Collections.reverse(result); 
    } 
    return result; 
} 
+6

這可能不適用,如果'分頁'發揮作用。 – 2012-07-06 08:59:53

+1

只是一個說明,它總是更好地排序在數據庫中,而不是在可能的代碼。 – karol 2016-11-21 14:27:21