在命名查询的 ORDER BY 中设置参数
Posted
技术标签:
【中文标题】在命名查询的 ORDER BY 中设置参数【英文标题】:Setting parameter in ORDER BY of named query 【发布时间】:2013-11-24 13:32:25 【问题描述】:我正在使用如下命名查询;
@NamedQuery(name = "MyClass.findAll", query = "SELECT .... ORDER BY user.:sortColumn :sortOrder")
我希望动态设置 sortColumn 和 sortOrder。
所以我用;
query.setParameter("sortColumn", sortColumn);
query.setParameter("sortOrder", sortOrder);
我可以毫无问题地传递/设置 WHERE 子句中的参数。
但是我收到了 :sortColumn 的意外令牌错误
我在这里做错了吗?
【问题讨论】:
【参考方案1】:查询分析器需要 标识符 - 不可变 - 而不是
user.:sortColumn
它也期望 [key/reserved]word - 不是可变的 - 而不是
:sortOrder
所以,您最好对订单字段和订单类型使用不同的查询。
【讨论】:
【参考方案2】:对于命名查询,与 WHERE 和 HAVING 子句不同,ORDER BY 子句无法在运行时进行参数化。此类问题的解决方案是使用 Criteria API。
【讨论】:
Thx...你能提供 Criteria API 的参考示例【参考方案3】:实际上,如果您同意使用 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);
...
【讨论】:
以上是关于在命名查询的 ORDER BY 中设置参数的主要内容,如果未能解决你的问题,请参考以下文章