HIbernate HQL 意外令牌

Posted

技术标签:

【中文标题】HIbernate HQL 意外令牌【英文标题】:HIbernate HQL unexpected token 【发布时间】:2019-11-12 12:22:58 【问题描述】:

我有以下 Hibernate 查询:

String HSQL = "from Page as p "
  + "where not exists (from Link as l where l.dealId = p.id) "
  + "and p.userId = :userId";

return (List<Deal>) sessionFactory.getCurrentSession()
  .createQuery(HSQL)
  .setParameter("userId", userId)
  .list();

但在方法 .createQuery(HSQL) 上失败并出现以下异常

[ ERROR ] [12.11.2019 13:19:10] --- U: I: S: --- org.hibernate.hql.internal.ast.ErrorTracker: line 1:137: unexpected token: .
[ ERROR ] [12.11.2019 13:19:10] --- U: I: S: --- org.hibernate.hql.internal.ast.ErrorTracker: line 1:137: unexpected token: .
antlr.NoViableAltException: unexpected token: .
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClassOrOuterQueryPath(HqlBaseParser.java:1972) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1499) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1343) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1063) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.subQuery(HqlBaseParser.java:3910) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.quantifiedExpression(HqlBaseParser.java:3515) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3373) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3273) [hibernate-core-5.4.1.Final.jar:5.4.1.Final]
...

我的 Hibernate 版本是 5.4.1。

查询有什么问题?

【问题讨论】:

据我所知,在 HQL 查询中声明别名之前无需使用 as dealId的类型是什么 你能分享你的实体吗 【参考方案1】:

我认为在您的实体中 dealIdPage 类型而不是 Long 类型,因此您可以使用:

"where not exists (from Link as l where l.dealId = p) "
                                        ^^^^^^^^^^^^

【讨论】:

其实SELECT在HQL中应该是可选的,至少对于外部查询来说肯定是这样的。见这里:docs.jboss.org/hibernate/core/3.3/reference/en/html/… 嗨@TimBiegeleisen,我同意这是可选的,您的问题中有一部分我无法理解抱歉,请您澄清一下:) 谢谢,这让我找到了解决方案。实体没有 dealId 属性,而是交易本身。所以如果我做了l.dealId = p,它就开始工作了。

以上是关于HIbernate HQL 意外令牌的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时

意外令牌:(在 HQL 中

HQL SUM 查询 - 意外令牌

HTTP 状态 500 - 意外令牌:,靠近第 1 行,第 129 列

HQL:选择语句以及使用“case when then”给出意外的令牌错误

Hibernate HQL - 不存在抛出 org.hibernate.exception.SQLGrammarException 的条件: