Hibernate Sub запрос внутри case когда оператор - PullRequest
4 голосов
/ 15 марта 2012

У меня проблема с выполнением подзапроса HQL внутри оператора case когда *.

Вот мой код:

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 Ответ

4 голосов
/ 30 июня 2016

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

создать или заменить принудительное представление VW_ENTITY_VALUE (entityValue) как выберите случай, когда a.entityId равен нулю, а затем «недействителен» (выберите b.entityName из tblName b, где 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.weight> ( выберите значение avg (cat.weight) из кошки DomesticCat ) от DomesticCat как кошка где cat.name = некоторые ( выберите name.nickName из Name в качестве имени ) от кота как кот где не существует ( от кота как помощник где mate.mate = кот ) от DomesticCat как кошка где cat.name не в ( выберите name.nickName из Name в качестве имени ) выберите cat.id, (выберите max (kit.weight) из набора cat.kitten) от кота как кот Обратите внимание, что подзапросы HQL могут появляться только в предложениях select или where.

...