在命名查询的ORDER BY中设置参数

时间:2013-11-24 13:32:25

标签: java sql jpa named-query

我正在使用如下的命名查询;

@NamedQuery(name = "MyClass.findAll", query = "SELECT .... ORDER BY user.:sortColumn :sortOrder")

我希望动态设置sortColumn和sortOrder。

所以我用;

query.setParameter("sortColumn", sortColumn);
query.setParameter("sortOrder", sortOrder);

我可以在WHERE子句中传递/设置参数而不会出现任何问题。

但是我收到了意外的令牌错误:sortColumn

我在这里做错了吗?

3 个答案:

答案 0 :(得分:0)

查询分析器需要标识符 - 不是变量 - 而不是

user.:sortColumn 

它还希望 [key / reserved]字 - 不是变量 - 而不是

:sortOrder

因此,您最好对订单字段和订单类型使用不同的查询。

答案 1 :(得分:0)

对于命名查询,与 WHERE HAVING 子句不同, ORDER BY 子句无法在运行时参数化。这种问题的解决方案是使用Criteria API。

答案 2 :(得分:0)

实际上,如果您同意使用JPQL查询(但不是部署时检查的NamedQuery),则可以在查询字符串中定义参数,然后将查询字符串传递给{{1只需用您想要的替换参数即可。当然,您需要对参数值进行一些完整性检查。

e.g

EntityManager