[英]Setting parameter in ORDER BY of 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的意外令牌错误
我在这里做错什么了吗?
查询分析器需要标识符 -不是变量-而不是
user.:sortColumn
它还期望[key / reserved] word -not variable-而不是
:sortOrder
因此,您最好对订单字段和订单类型使用不同的查询。
对于命名查询,与WHERE和HAVING子句不同,无法在运行时对ORDER BY子句进行参数化。 解决此问题的方法是使用Criteria API。
实际上,如果您同意使用JPQL查询(而不是在部署时检查的NamedQuery
),则可以在查询字符串中定义参数,然后在将查询字符串传递给EntityManager
,只需将参数替换为您所需要的想。 当然,您需要对参数值进行一些完整性检查。
例如
String queryStr = "SELECT .... ORDER BY user.:sortColumn :sortOrder";
//TODO sanity check of passedSortCol, passedSortOrder
queryStr = queryStr.replace(":sortColumn", passedSortCol);
queryStr = queryStr.replace(":sortOrder", passedSortOrder);
Query query = entityManager.createQuery(queryStr);
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.