在命名查询的 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】:

对于命名查询,与 WHEREHAVING 子句不同,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 中设置参数的主要内容,如果未能解决你的问题,请参考以下文章

重命名 ASP.NET 中的“文化”查询参数以进行本地化

在@NamedQuery (JPA QL 1.0) 中设置为空的参数

JPA 命名查询与 group by 参数名和值

对于在同一类中设置全局变量的例程,啥是好的命名约定

如何在 xml 属性中设置命名空间?

如何使用 lxml 在属性值中设置命名空间前缀?