意外的令牌:(在HQL中

时间:2016-01-26 00:23:15

标签: java hql

我收到错误意外令牌:( 在查询下面,但同样的查询在 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:意外   token:max at   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)

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

14.13. Subqueries

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