我试图写JPQL查询带有ORDER BY子句:

query = "SELECT c FROM item ORDER BY c.name ASC"

我想设置一个“命令”参数,其值将是任一“ASC”或“DESC”:

query = "SELECT c FROM item ORDER BY c.name :order"

然后在我的实现:

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作为参数,通过@马克指出的)。

而不是写两次命名查询“按订单”条款包含的,你可以实现你的DAO是这样的:

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;
}

我想正确的方式是使用 ORDER BY标准API的条款

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")));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top