18

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

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

知道我做错了什么吗?谢谢!

4

4 回答 4

22

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

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

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

于 2010-09-01T08:34:10.437 回答
7

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

于 2010-09-01T10:53:42.307 回答
5

您可以通过以下方式实现 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;
}
于 2011-11-09T08:35:01.147 回答
1

我想正确的方法是使用Criteria API 的 ORDER BY 子句

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")));
于 2019-03-05T17:44:25.950 回答