我正在尝试使用ORDER BY子句编写JPQL查询:
query = "SELECT c FROM item ORDER BY c.name ASC"
我想设置一个“order”参数,其值可以是“ASC”或“DESC”:
query = "SELECT c FROM item ORDER BY c.name :order"
然后在我的实施中:
query.setParameter("order", "ASC");
这是我收到Hibernate错误的时候:
org.hibernate.HibernateException: Errors in named queries
对我做错了什么的任何想法?谢谢!
答案 0 :(得分:18)
“ASC”或“DESC”不能是查询参数。您可以使用字符串连接。
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
您应该验证sortOrder
的内容只能是ASC或DESC,而不是直接来自用户。
答案 1 :(得分:7)
如果你想在这里使用命名查询,你需要其中两个(命名查询是静态的,你不能使用ASC和DESC作为@Mark指出的参数)。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
我想正确的方法是使用ORDER BY clause of Criteria 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")));