Как написать Порядок по выражению в JPQL - PullRequest
6 голосов
/ 07 декабря 2010

PostgreSQL и MySQL предлагают записать выражение в предложение ORDER BY в запросе SQL.Это позволяет сортировать элементы по некоторому столбцу, но специальные значения находятся сверху.SQL выглядит следующим образом.(работает в Postgres)

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")

Это JPA 1.0 с драйвером Hibernate.Сервер приложений выдает это исключение при развертывании.

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)

Большое спасибо.

1 Ответ

14 голосов
/ 08 декабря 2010

Для именованного запроса (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) Статический способ в компоненте управления данными, если элемент упорядочения фиксирован.

Уровень поля:

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

Уровень метода:

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