带参数的JPQL ORDER BY子句

Pie*_*ouy 16 orm hibernate jpa sql-order-by jpql

我正在尝试使用ORDER BY子句编写JPQL查询:

query = "SELECT c FROM item ORDER BY c.name ASC"
Run Code Online (Sandbox Code Playgroud)

我想设置一个"order"参数,其值可以是"ASC"或"DESC":

query = "SELECT c FROM item ORDER BY c.name :order"
Run Code Online (Sandbox Code Playgroud)

然后在我的实现中:

query.setParameter("order", "ASC");
Run Code Online (Sandbox Code Playgroud)

这是我收到Hibernate错误的时候:

org.hibernate.HibernateException: Errors in named queries
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的任何想法?谢谢!

Mar*_*ers 18

"ASC"或"DESC"不能是查询参数.您可以使用字符串连接.

query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
Run Code Online (Sandbox Code Playgroud)

您应该验证内容sortOrder只能是ASC或DESC,而不是直接来自用户.


Pas*_*ent 7

如果你想在这里使用命名查询,你需要其中两个(命名查询是静态的,你不能使用ASC和DESC作为@Mark指出的参数).


ska*_*kay 5

您可以通过以下方式实现DAO,而不是将包含"order by"子句的命名Query写入两次:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果"分页"开始播放,这可能不适用. (6认同)