Hibernate 带参数的JPQL ORDER BY子句

Hibernate 带参数的JPQL ORDER BY子句,hibernate,orm,jpa,sql-order-by,jpql,Hibernate,Orm,Jpa,Sql Order By,Jpql,我正在尝试使用ORDERBY子句编写JPQL查询: query = "SELECT c FROM item ORDER BY c.name ASC" 我想设置一个“order”参数,其值为“ASC”或“DESC”: 然后在我的实现中: query.setParameter("order", "ASC"); 这是当我出现休眠错误时: org.hibernate.HibernateException: Errors in named queries 知道我做错了什么吗?谢谢 ASC或DESC不

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

query = "SELECT c FROM item ORDER BY c.name ASC"
我想设置一个“order”参数,其值为“ASC”或“DESC”:

然后在我的实现中:

query.setParameter("order", "ASC");
这是当我出现休眠错误时:

org.hibernate.HibernateException: Errors in named queries
知道我做错了什么吗?谢谢

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

query = "SELECT c FROM item ORDER BY c.name " + sortOrder;

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

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

您可以通过以下方式实现DAO,而不是编写两次包含“order by”子句的命名查询:

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;
}
公共列表findByAttribute(布尔描述,…){
TypedQuery q=em.createNamedQuery(。。。
q、 设置参数(。。。
List result=q.getResultList();
如果(描述){
收集。反向(结果);
}
返回结果;
}

我想正确的方法是使用

CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery q=cb.createQuery(Country.class);
根c=q.from(国家级);
q、 选择(c);
q、 订货人(cb.asc(货币)、cb.desc(人口);

好的,这解释了很多。在@NamedQuery的声明中是否有使用字符串连接的方法?或者我想我可以使用动态查询?@Pedro当然。但这不是@NamedQuery(我实际上是在回答你的一条评论).你是对的。但事实是,我有很多命名查询需要排序,因此为每个查询创建2个查询将导致两倍的命名查询。这是一个问题吗?还是应该使用动态查询?从维护的角度来看,使用动态查询肯定会更好。这是我会做的。这可能不适用于如果使用
分页
,则可以进行排序。请注意,在可能的情况下,最好在数据库中排序,而不是在代码中排序。
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;
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Country> q = cb.createQuery(Country.class);
Root<Country> c = q.from(Country.class);
q.select(c);
q.orderBy(cb.asc(c.get("currency")), cb.desc(c.get("population")));