2012-03-15 2 views
3

У меня возникла проблема с выполнением подпроцесса HQL внутри case when statement.Hibernate Sub query in case when statement

вот мой код:

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 

Спасибо за любую помощь!

Ok .. вот полный стек след

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

какая ошибка дает? – ManuPK

+0

org.hibernate.hql.ast.QuerySyntaxException: неожиданный узел АСТ –

+0

до сих пор не знает! Отредактируйте вопрос и добавьте ** полную трассировку стека **! – ManuPK

ответ

2

Эта функция не поддерживается в спящем режиме. Но существует обходное решение. Создайте представление в базе данных, а затем используйте HQL для извлечения результата через java.

создать или заменить вид силы VW_ENTITY_VALUE (EntityValue) в выберите случай, когда a.entityId равно нулю, то «инвалид» еще (выберите b.entityName из tblName б где 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). Разрешены даже коррелированные подзапросы (подзапросы, которые ссылаются на псевдоним во внешнем запросе).

от Кота в FatCat где fatcat.weight> ( выберите ср (cat.weight) от DomesticCat кошки ) из DomesticCat, как кошка где cat.name = некоторые ( выберите name.nickName от имени в качестве имени ) от кота, как кот , где не существует ( от кота как партнер, где mate.mate = кошка ) из DomesticCat, как кошка где cat.name не в ( выберите name.nickName от имени в качестве имени ) выберите cat.id, (sel ect max (kit.weight) из набора cat.kitten) от Cat as cat Обратите внимание, что подзапросы HQL могут встречаться только в предложениях select или where.