HQL para experts. Ajuda ai galera

Desculpem o titulo, mas relamente estou com um HQL aqui bem cabeludo… Como disse no post anterior, estou a 1 semana trabalhando com Hibernate.

A princípio, parece ser um erro bem tosco (nullPointer), mas olhando atentamento, percebe-se que não.

Algumas considerações.
Uso annotations. E pelo que andei lendo, sem hqm.xml o hibernate não suporta join. Um bug bem chato. Tive que fazer subselect para ter o mesmo efeito.

Tenho que fazer condições nesse hql, e pelo que tambem li, o hibernate até aceita case, when, then, else… mas não aceita seguido e IS NULL. Outro bug.

Qualquer tipo de ajuda ou conselho será apreciado. Caso haja erro no codigo, favor me avisar.

Timestamp dataInicial = new Timestamp(relatorioGeralDTO.getDataInicial().getTime()); Timestamp dataFinal = new Timestamp(relatorioGeralDTO.getDataFinal().getTime()); SELECT DISTINCT c.serie, c.nomeReal, CASE WHEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c4 WHERE c4.dataCons = ('" + dataInicial + "', - 1) and c4.idImprSnmp = c.idImprSnmp) IS NULL THEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c5 WHERE (c5.dataCons BETWEEN '" + dataInicial + "' AND '" + dataFinal + "') AND c5.serie = c.serie) ELSE (SELECT MAX(qTotal) FROM ConsSnmpImpr c4 WHERE c4.dataCons = ('" + dataInicial + "', - 1) and c4.idImprSnmp = c.idImprSnmp) END as contAnterior, CASE WHEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c2 WHERE c2.dataCons = '" + dataInicial + "' and c2.idImprSnmp = c.idImprSnmp) IS NULL THEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c3 WHERE (c3.dataCons BETWEEN '" + dataInicial + "' AND '" + dataFinal + "') AND c3.serie = c.serie) ELSE (SELECT MAX(qTotal) FROM ConsSnmpImpr c2 WHERE c2.dataCons = '" + dataFinal + "' and c2.idImprSnmp = c.idImprSnmp) END as contAtual FROM ImpressoraGrupo ig, ConsSnmpImpr c WHERE ig.idConsSnmpImpr in (SELECT c6.idConsSnmpImpr FROM ConsSnmpImpr c6) AND ig.idGrupo in (SELECT g2.idGrupo FROM Grupo g2) /*JOIN ConsSnmpImpr c ON c.idConsSnmpImpr = ig.idConsSnmpImpr JOIN Grupo g ON g.idGrupo = ig.idGrupo */ AND c.dataCons BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' AND g.idGrupo = '" + relatorioGeralDTO.getIdDepartamento() + "'//IdDepartamento é IdGrupo.

ERRO

java.lang.NullPointerException
at org.hibernate.hql.ast.tree.CaseNode.getDataType(CaseNode.java:40)
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:152)
at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:843)
at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:631)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:676)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:292)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235)
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:98)
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:1760)
at br.inf.baobing.baoprint.relatorio.RelatorioGeralDAO.getRelatorioImpressorasPorDepartamento(RelatorioGeralDAO.java:221)
at br.inf.baobing.baoprint.relatorio.RelatorioGeralAction.listarGridRelatorioImpressorasPorDepartamento(RelatorioGeralAction.java:534)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:722)
Dez 02, 2011 12:25:34 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet action threw exception
br.inf.baobing.baoprint.db.DAOException
at br.inf.baobing.baoprint.relatorio.RelatorioGeralDAO.getRelatorioImpressorasPorDepartamento(RelatorioGeralDAO.java:238)
at br.inf.baobing.baoprint.relatorio.RelatorioGeralAction.listarGridRelatorioImpressorasPorDepartamento(RelatorioGeralAction.java:534)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:722)

para melhor visualização

Timestamp dataInicial = new Timestamp(relatorioGeralDTO.getDataInicial().getTime()); Timestamp dataFinal = new Timestamp(relatorioGeralDTO.getDataFinal().getTime()); hql = new StringBuilder(); hql.append("SELECT DISTINCT "); hql.append("c.serie, "); hql.append("c.nomeReal, "); hql.append("CASE "); hql.append("WHEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c4 WHERE c4.dataCons = ('" + dataInicial + "', - 1) and c4.idImprSnmp = c.idImprSnmp) IS NULL "); hql.append("THEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c5 WHERE (c5.dataCons BETWEEN '" + dataInicial + "' AND '" + dataFinal + "') AND c5.serie = c.serie) "); hql.append("ELSE (SELECT MAX(qTotal) FROM ConsSnmpImpr c4 WHERE c4.dataCons = ('" + dataInicial + "', - 1) and c4.idImprSnmp = c.idImprSnmp) "); hql.append("END as contAnterior, "); hql.append("CASE "); hql.append("WHEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c2 WHERE c2.dataCons = '" + dataInicial + "' and c2.idImprSnmp = c.idImprSnmp) IS NULL "); hql.append("THEN (SELECT MAX(qTotal) FROM ConsSnmpImpr c3 WHERE (c3.dataCons BETWEEN '" + dataInicial + "' AND '" + dataFinal + "') AND c3.serie = c.serie) "); hql.append("ELSE (SELECT MAX(qTotal) FROM ConsSnmpImpr c2 WHERE c2.dataCons = '" + dataFinal + "' and c2.idImprSnmp = c.idImprSnmp) "); hql.append("END as contAtual "); hql.append("FROM ImpressoraGrupo ig, ConsSnmpImpr c "); hql.append("WHERE ig.idConsSnmpImpr in (SELECT c6.idConsSnmpImpr FROM ConsSnmpImpr c6) "); hql.append("AND ig.idGrupo in (SELECT g2.idGrupo FROM Grupo g2) "); /*hql.append("JOIN ConsSnmpImpr c "); hql.append("ON c.idConsSnmpImpr = ig.idConsSnmpImpr "); hql.append("JOIN Grupo g "); hql.append("ON g.idGrupo = ig.idGrupo ");*/ hql.append("AND c.dataCons "); hql.append("BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' "); hql.append("AND g.idGrupo = '" + relatorioGeralDTO.getIdDepartamento() + "'");//IdDepartamento é IdGrupo. /*hql.append("GROUP BY "); hql.append("c.serie, c.nomeReal, contAnterior, contAtual, g.idGrupo");*/ return hql;

Alguém pra ajudar?