【问题标题】:Case statement with nested select in HQLHQL中带有嵌套选择的case语句
【发布时间】:2011-07-08 10:47:55
【问题描述】:

我无法为此 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 映射在上下文中。

任何建议将不胜感激。

【问题讨论】:

  • 我们能看到 HQL 吗?您能否将表 2 连接到表 1 作为查询的一部分并在 hql 中说:select (case column1 when 'VALUE1' then table1.col2 else column3 end) from Table2 left join table2.table1 as table1 或类似?

标签: hibernate hql


【解决方案1】:

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 需要加入,那么不要忘记这样做,如果不是这里会发生笛卡尔加入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多