我在为此 SQL (Oracle) 创建 HQL 语句时遇到问题。
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 映射都在上下文中。
如有任何建议,我们将不胜感激。
最佳答案
Table1 只有一条记录吗?如果没有,那么在案例中选择将不起作用,请尝试在 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需要连接,那么不要忘记这样做,否则这里会发生笛卡尔连接。
关于hibernate - HQL 中带有嵌套 select 的 Case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623399/