我正在使用如下的命名查询;
@NamedQuery(name = "MyClass.findAll", query = "SELECT .... ORDER BY user.:sortColumn :sortOrder")
我希望动态设置sortColumn和sortOrder。
所以我用;
query.setParameter("sortColumn", sortColumn);
query.setParameter("sortOrder", sortOrder);
我可以在WHERE子句中传递/设置参数而不会出现任何问题。
但是我收到了意外的令牌错误:sortColumn
我在这里做错了吗?
答案 0 :(得分:0)
查询分析器需要标识符 - 不是变量 - 而不是
user.:sortColumn
它还希望 [key / reserved]字 - 不是变量 - 而不是
:sortOrder
因此,您最好对订单字段和订单类型使用不同的查询。
答案 1 :(得分:0)
对于命名查询,与 WHERE 和 HAVING 子句不同, ORDER BY 子句无法在运行时参数化。这种问题的解决方案是使用Criteria API。
答案 2 :(得分:0)
实际上,如果您同意使用JPQL查询(但不是部署时检查的NamedQuery
),则可以在查询字符串中定义参数,然后将查询字符串传递给{{1只需用您想要的替换参数即可。当然,您需要对参数值进行一些完整性检查。
e.g
EntityManager