我在使用case语句时执行HQL子查询时遇到问题。
这是我的代码:
select case when a.entityId is null then 'invalid' else
(select b.entityName from tblName b where b.entityId =a.entityId)
end from tblEntity a
感谢您的帮助!
好的..这是完整的堆栈跟踪
ERROR org.hibernate.hql.PARSER - <AST>:0:0: unexpected AST node: query
Exception in thread "Thread-5" org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: query [select case when a.entityId is null then 'invalid' else
(select b.entityName from tblName b where b.entityId =a.entityId)
end from tblEntity a]
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
答案 0 :(得分:4)
Hibernate不支持此功能。 但确实存在一种解决方法。 在数据库中创建一个视图,然后使用HQL通过java获取结果。
创建或替换强制视图VW_ENTITY_VALUE(entityValue) 如 当a.entityId为null时选择case,然后'else' (从tblName b中选择b.entityName,其中b.entityId = a.entityId) 从tblEntity结束a;
来自HQL的文档: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-subqueries
14.13。子查询
对于支持子选择的数据库,Hibernate支持查询中的子查询。子查询必须用括号括起来(通常通过SQL聚合函数调用)。即使是相关的子查询(在外部查询中引用别名的子查询)也是允许的。
来自Cat as fatcat fatcat.weight&gt; ( 从DomesticCat cat中选择avg(cat.weight) ) 来自DomesticCat作为猫 其中cat.name = some( 从Name中选择name.nickName作为名称 ) 从猫作为猫 哪里不存在( 来自Cat作为mate.mate = cat的伴侣 ) 来自DomesticCat作为猫 cat.name不在的地方( 从Name中选择name.nickName作为名称 ) 选择cat.id,(从cat.kitten kit中选择max(kit.weight)) 从猫作为猫 请注意,HQL子查询只能出现在select或where子句中。