2010-12-07 9 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

名前付きクエリの場合、実行時にDSC/ASCをパラメータ化できないため、(ORDER BY(a.id =:id)またはORDER BY(:id))は機能しません。

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'は何を意味するのでしょうか?それは列の名前だけであるか、それとも表現式にすることができますか?したがって、最初のオプションはネイティブクエリを使用していますか?私はそれを望んでいない。そして2番目のオプションは良いです、私はそれを知っていますが、私の問題を解決していません。 – Gaim

+0

'orderElement'は、指定されたクエリで(:id)のような結果を並べ替えるために渡される単なるパラメータです。私が提供したクエリはネイティブクエリではなく、動的に作成するだけです。 –

関連する問題