繁体   English   中英

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

[英]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

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

对于命名查询,与WHEREHAVING子句不同,无法在运行时对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM