如何在JPQL中按表达式编写Order

Gai*_*aim 6 sql-order-by jpql

PostgreSQL和MySQL提供ORDER BY在SQL查询中将表达式写入子句.它允许按某些列对项目进行排序,但特殊值位于顶部.SQL看起来像这样.(适用于Postgres)

select * from article order by id = 4, id desc;
Run Code Online (Sandbox Code Playgroud)

现在我想在JPQL中编写它,但它不起作用.我的尝试是:

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

这是带有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)
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Nay*_*kar 14

对于命名查询,(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();
Run Code Online (Sandbox Code Playgroud)

2)如果订购元素是固定的,则在实体bean中使用静态方式.

现场级别:

@OrderBy("id ASC")
List<Article> articles;
Run Code Online (Sandbox Code Playgroud)

方法级别:

@OrderBy("id DESC")
public List<Article> getArticles() {...};
Run Code Online (Sandbox Code Playgroud)