Hibernate子查询里面的case语句

时间:2012-03-15 01:37:30

标签: hibernate subquery case

我在使用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)

1 个答案:

答案 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子句中。