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】:
我认为在您的实体中 dealId
是 Page
类型而不是 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,当尝试删除与自身连接的表时
HTTP 状态 500 - 意外令牌:,靠近第 1 行,第 129 列
HQL:选择语句以及使用“case when then”给出意外的令牌错误
Hibernate HQL - 不存在抛出 org.hibernate.exception.SQLGrammarException 的条件: