2010-09-01 29 views
16

我想写一个JPQL查询使用ORDER BY子句子句:JPQL ORDER BY与参数

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

我想设置一个“秩序”的参数,它的值是不是“ASC”或 “降序”:

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

然后在我的实现:

query.setParameter("order", "ASC"); 

这是当我得到一个休眠错误:

org.hibernate.HibernateException: Errors in named queries 

任何想法,我做错了什么?谢谢!

回答

17

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

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

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

+1

OK,说明了很多。无论如何,在@NamedQuery的声明中使用字符串连接? – 2010-09-01 08:52:37

+0

好的,谢谢! – 2010-09-01 09:40:44

7

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

+0

或者我想我可以只使用动态查询? – 2010-09-01 12:43:30

+0

@Pedro当然。但这不会是@NamedQuery(我实际上正在回答你的评论之一)。 – 2010-09-01 13:19:57

+0

你是对的。但事实是,我有很多命名查询需要排序,因此为每个查询创建2个查询会导致两倍的命名查询。那是问题吗?或者我应该使用动态查询吗? – 2010-09-01 13:36:40

5

而是写作的两次“由序”条款包含了一个名为查询,你可以实现你的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; 
} 
+6

这可能不适用,如果'分页'发挥作用。 – 2012-07-06 08:59:53

+1

只是一个说明,它总是更好地排序在数据库中,而不是在可能的代码。 – karol 2016-11-21 14:27:21