Оператор Case с вложенным выбором в HQL - PullRequest
4 голосов
/ 08 июля 2011

У меня проблема с созданием оператора HQL для этого SQL (Oracle).

SELECT 
 CASE WHEN Column1 = 'VALUE1' THEN (
  SELECT COL2 FROM Table1
 ) ELSE 
 Column3
END
 FROM TABLE2 WHERE Columnx = 'something that is unique'

HQL больше похож на тот же. Проблема в том, что вложенный выбор в кейсе.

Ошибка:

java.lang.NullPointerException
    at org.hibernate.hql.ast.tree.CaseNode.getDataType(CaseNode.java:40)
    at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:165)
    at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:831)
    at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:619)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:672)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
    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) 

Для 99% сопоставления Table1 и Table2 находятся в контексте.

Любой совет будет признателен.

1 Ответ

0 голосов
/ 10 июня 2013

Таблица1 имеет только одну запись? Если нет, то выбор изнутри кейса не будет работать, попробуйте соединить между table1 и table2, как это:

    SELECT 
     CASE WHEN Column1 = 'VALUE1' THEN (
     COL2
     ) ELSE 
     Column3
    END AS CASE1
     FROM TABLE2 , Table1 
    WHERE Columnx = 'something that is unique'

если нужно объединить table2, tabl3, не забудьте сделать это, если не произойдет декартово соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...