意外令牌:(在 HQL 中

Posted

技术标签:

【中文标题】意外令牌:(在 HQL 中【英文标题】:unexpected token : ( in HQL 【发布时间】:2016-05-02 11:51:27 【问题描述】:

我收到错误 unexpected token :( 在查询下方,但同样的查询在 SQL

中运行良好
"SELECT slh.assetId,slh.mapHierarchy "
+ "FROM AssetHistory slh "
+ "INNER JOIN "
+ "(SELECT assetId, MAX(lastUpdated) AS MaxDateTime "
+ "FROM AssetHistory "
+ "GROUP BY assetId) slh2 "
+ "ON slh.assetId = slh2.assetId "
+ "AND slh.lastUpdated =slh2.MaxDateTime ";

我希望有人可以帮助我。

这是错误日志:

2016 年 1 月 25 日下午 4:04:32 org.hibernate.hql.internal.ast.ErrorCounter reportError 错误:第 1:89 行:意外令牌:(2016 年 1 月 25 日 4:04:32 PM org.hibernate.hql.internal.ast.ErrorCounter reportError ERROR: line 1:89:意外令牌:( 第 1:89 行:意外令牌:( at org.hibernate.hql.internal.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1661) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1380) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1086) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:731) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:295) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)

错误:第 1:106 行:意外令牌:最大第 1:106 行:意外 令牌:最大值 org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1544) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1388) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1086) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:731) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323) 在 org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:295) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) 在 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 在 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 在 org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)

【问题讨论】:

【参考方案1】:

我认为 HQL 不支持 FROM 子句中的子查询。

14.13. Subqueries

请注意,HQL 子查询只能出现在 select 或 where 子句中。

【讨论】:

是的,你是对的,hql 不支持 FROM 子句中的子查询,子查询应该是 WHERE 或 SELECT 子句【参考方案2】:

我认为您应该将子查询从 join 移动到 where 子句。

"SELECT slh.assetId,slh.mapHierarchy "
+ "FROM AssetHistory slh "
+" WHERE (slh.assetId, slh.lastUpdated)"
+ " IN 
+ "(SELECT assetId, MAX(lastUpdated) AS MaxDateTime "
+ "FROM AssetHistory "
+ "GROUP BY assetId);

【讨论】:

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

HIbernate HQL 意外令牌

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

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FETCH

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

休眠异常:意外令牌:HAVING

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