【问题标题】:Creating queries using JPQL -- Query Syntax Exception使用 JPQL 创建查询——查询语法异常
【发布时间】:2011-05-11 18:02:59
【问题描述】:

当我运行该方法时:dao.query("SELECT p FROM Profile p WHERE p.group = :id ORDER BY p.datestamp :key", map); 我收到以下错误:

org.hibernate.hql.ast.QuerySyntaxException: 意外令牌::在第 1 行附近, 第 93 列 [从配置文件 p 中选择 p WHERE p.group = :id ORDER BY p.datesamp :key]

以下是查询方法的实现;有人看到有什么问题吗?

public List<?> query(String criteria, HashMap<String, ?> args) {
        Query sqlQuery = this.em.createQuery(criteria);
        Set<String> keys = args.keySet();
        Iterator<String> iter = keys.iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            sqlQuery.setParameter(key, args.get(key));
        }
        return sqlQuery.getResultList();
    }

【问题讨论】:

  • 你想达到什么目的?这段代码现在看起来完全没有意义了。
  • @axtavt:我正在尝试选择具有特定组 id 的配置文件,并且我想根据 DESC:key 参数按日期戳对配置文件进行排序.

标签: java hibernate jpa jpql


【解决方案1】:

不能使用参数指定排序方向,因为参数不能在查询的任意位置使用。来自 JPA 规范:

输入参数只能用在查询的 WHERE 子句或 HAVING 子句中。

因此,在 JPA 1.0 中,您必须手动使用适当的 ORDER 子句构建查询字符串。

在 JPA 2.0 中,您可以使用 Criteria API 来构建动态查询。

【讨论】:

    【解决方案2】:

    我认为ORDER BY p.datestamp 之后和:key 之前需要一个逗号

    【讨论】:

    • 感谢您的建议,但效果不太好。本质上,我正在尝试实现这一点:SELECT p FROM Profile p WHERE p.group = :id ORDER BY p.datestamp [ASC|DESC] 其中顺序由:key 参数确定。
    猜你喜欢
    • 2020-05-31
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多