【问题标题】:Setting parameter in ORDER BY of named query在命名查询的 ORDER BY 中设置参数
【发布时间】: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 的意外令牌错误

我在这里做错了吗?

【问题讨论】:

    标签: java sql jpa named-query


    【解决方案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);
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多