2010-12-07 25 views
3

中按表達式排序PostgreSQL和MySQL提供了在SQL查詢中將表達式寫入ORDER BY子句。它允許按列排序項目,但特殊值位於頂部。 SQL看起來像這樣。 (在Postgres中工作)如何寫在JPQL

select * from article order by id = 4, id desc; 

現在我想寫在JPQL中,但它不起作用。我的嘗試是:

@NamedQuery(name = "Article.special", query = "SELECT a FROM Article a ORDER BY (a.id = :id) DESC, a.id DESC") 

這是帶有Hibernate驅動程序的JPA 1.0。應用程序服務器在部署時引發此異常。

ERROR [SessionFactoryImpl] Error in named query: Article.special 
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: = near line 1, column 73 [SELECT a FROM cz.cvut.fel.sk.model.department.Article a ORDER BY (a.id = :id) DESC, a.id DESC] 
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 

非常感謝。

回答

9

對於命名查詢,(ORDER BY(a.id =:id)或ORDER BY(:id))將不起作用,因爲DSC/ASC無法在運行時進行參數化。

1)動態方式,如果排序元素在運行時變化。

String query = "SELECT a FROM Article a ORDER BY "+orderElement+" DESC, a.id DESC"; 
entityManager.createQuery(query).getResultList(); 

2)如果排序元素是固定的,則在實體bean中的靜態方式。

現場級:

@OrderBy("id ASC") 
List<Article> articles; 

方法級別:

@OrderBy("id DESC") 
public List<Article> getArticles() {...}; 
+0

什麼是'orderElement`是什麼意思?它只是列的名稱,或者它可以是表達式?所以第一個選項是使用本機查詢?我不想要它。第二個選擇是好的,我知道但是並不能解決我的問題。 – Gaim 2010-12-08 13:14:29