【问题标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: onorg.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:开启
【发布时间】:2020-09-05 15:31:46
【问题描述】:

我正在尝试运行查询,但不确定它是否受支持,我面临的问题是我想在查询中传递一个列表。我在查询中也有一些连接,查询失败并显示消息:

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:开启。

我怎样才能做到这一点?

EntityManager em = emf.createEntityManager();
Query query = em.createQuery(
   " SELECT s,c from Sow s left join ChildSow c " + 
   "  inner join Project p on p.projectId = s.projectId on s.employeeId = c.employeeId " + 
   "  and s.projectId = c.correctProjectId ");

@SuppressWarnings("unchecked")
List<Object> list =  query.getResultList();
em.close();
9:56:35.195 [http-nio-8080-exec-1] ERROR o.h.hql.internal.ast.ErrorTracker - line 1:211: unexpected token: on
19:56:35.204 [http-nio-8080-exec-1] ERROR o.h.hql.internal.ast.ErrorTracker - line 1:211: unexpected token: on
antlr.NoViableAltException: unexpected token: on
    at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3633)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3401)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3273)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2930)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:615)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2697)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2653)
    at org.hibernate.hql.internal.antlr.Hql

【问题讨论】:

  • 请去掉与问题无关的注释代码。还请提供完整的堆栈跟踪。
  • 如前所述添加

标签: hibernate jpa jpql


【解决方案1】:

您应该通过以下方式更正您的查询:

List<Object[]>  result = em.createQuery(
    "SELECT s, c from Sow s left join ChildSow c " + 
    "inner join Project p on p.projectId = s.projectId " + 
    "where s.employeeId = c.employeeId and s.projectId = c.correctProjectId",
Object[].class).getResultList();

result.forEach(row -> {
   Sow sow =  (Sow) row[0];
   ChildSow childSow = (ChildSow) row[1];
   // ...
});

请注意,当您的查询使用多个root entity references 时,您将获得Object[] 列表形式的结果。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2020-03-13
    • 2021-08-20
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2018-11-16
    • 2018-10-09
    相关资源
    最近更新 更多