【问题标题】:HIbernate HQL unexpected tokenHIbernate HQL 意外令牌
【发布时间】: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的类型是什么
  • 你能分享你的实体吗

标签: java hibernate hsqldb


【解决方案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,它就开始工作了。
猜你喜欢
  • 2014-11-13
  • 2015-05-21
  • 2017-05-02
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多