HQL porque esta query não funciona?

3 respostas
Flasoft

@NamedQuery(name = “UsuarioBean.listarFuncionalidades”, query = “SELECT u.perfil.relPerfilFuncionalidades.chaveComposta.funcionalidade.descricao FROM UsuarioBean u WHERE u.pontos >= u.perfil.relPerfilFuncionalidades.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)”)

lança o erro:

4625 [main] ERROR org.hibernate.impl.SessionFactoryImpl  - Error in named query: UsuarioBean.listarFuncionalidades

org.hibernate.QueryException: illegal attempt to dereference collection [usuariobea0_.id_usuariousuariobea0_.id_perfilperfil.relPerfilFuncionalidades] with element property reference [chaveComposta] [SELECT u.perfil.relPerfilFuncionalidades.chaveComposta.funcionalidade.descricao FROM br.fs.videos.model.UsuarioBean u WHERE u.pontos >= u.perfil.relPerfilFuncionalidades.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)]

at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:68)

at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:564)

at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:225)

at org.hibernate.hql.ast.tree.DotNode.resolveFirstChild(DotNode.java:175)

at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:550)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRef(HqlSqlBaseWalker.java:1147)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRefLhs(HqlSqlBaseWalker.java:5167)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRef(HqlSqlBaseWalker.java:1133)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:1993)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1932)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1476)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:580)

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.(HQLQueryPlan.java:101)

at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)

at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)

at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:484)

at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:394)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)


Alguém sabe o porque?
Os nomes de campos estão todos corretos!

3 Respostas

j0nny

Poste uma parte da sua classe mapeada!

Flasoft

Acho q entendi como funciona…
Eu estava esperando mais do hibernate do que ele é capaz… :smiley:

Antes estava assim:

SELECT u.perfil.relPerfilFuncionalidades.chaveComposta.funcionalidade.descricao FROM UsuarioBean u WHERE u.pontos >= u.perfil.relPerfilFuncionalidades.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)

Para funcionar eu fiz assim:

SELECT f FROM UsuarioBean u, RelPerfilFuncionalidadeBean rpf, FuncionalidadeBean f WHERE rpf.chaveComposta.funcionalidade.idFuncionalidade = f.idFuncionalidade AND u.perfil.idPerfil = rpf.chaveComposta.perfil.idPerfil AND u.pontos >= rpf.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)

O que eu imaginava é que se existisse um caminho para chegar em meu resultado dando apenas GETs, eu poderia fazer em HQL que o hibernate se virava para me trazer o resultado!
Mas eu entendi (eu ACHO) que eu tenho que fazer exatamente como eu faria utilizando SQL… pensando da mesma forma, um EntityBean para cada tabela!

Certo?

j0nny

Flasoft:
Acho q entendi como funciona…
Eu estava esperando mais do hibernate do que ele é capaz… :smiley:

Antes estava assim:

SELECT u.perfil.relPerfilFuncionalidades.chaveComposta.funcionalidade.descricao FROM UsuarioBean u WHERE u.pontos >= u.perfil.relPerfilFuncionalidades.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)

Para funcionar eu fiz assim:

SELECT f FROM UsuarioBean u, RelPerfilFuncionalidadeBean rpf, FuncionalidadeBean f WHERE rpf.chaveComposta.funcionalidade.idFuncionalidade = f.idFuncionalidade AND u.perfil.idPerfil = rpf.chaveComposta.perfil.idPerfil AND u.pontos >= rpf.pontosMinimos AND u.idUsuario = UPPER(:idUsuario)

O que eu imaginava é que se existisse um caminho para chegar em meu resultado dando apenas GETs, eu poderia fazer em HQL que o hibernate se virava para me trazer o resultado!
Mas eu entendi (eu ACHO) que eu tenho que fazer exatamente como eu faria utilizando SQL… pensando da mesma forma, um EntityBean para cada tabela!

Certo?

Basicamente isso, cada classe anotada como Entity, representa uma tabela do seu banco, e que cada atributo dessa classe representa uma coluna da sua tabela.

Criado 20 de abril de 2010
Ultima resposta 20 de abr. de 2010
Respostas 3
Participantes 2