Join no HQL

6 respostas
tatianefernanda

Boa tarde amigos do GUJ!
Bom, eu tenho o seguinte hql:

sb.append("select atr,ic from LogAtributoAlteradoImpl atr join ICImpl ic "); sb.append("where atr.atributo='localizacao' and (atr.valor_original like '%INFORMÁTICA%' or atr.valor_alterado like '%INFORMÁTICA%') order by ic.bp ");

Mas ao executá-lo ele dá um erro com a seguinte mensagem:
Path expected for join!
Invalid path: 'ic.bp’
No data type for node: org.hibernate.hql.ast.tree.IdentNode
-[IDENT] IdentNode: ‘ic’ {originalText=ic}

A árvore que é mostrada segue abaixo:

-[QUERY] ‘query’
±[SELECT_FROM] ‘SELECT_FROM’
| ±[FROM] ‘from’
| | ±[RANGE] ‘RANGE’
| | | ±[DOT] ‘.’
| | | | ±[DOT] ‘.’
| | | | | ±[DOT] ‘.’
| | | | | | ±[DOT] ‘.’
| | | | | | | ±[DOT] ‘.’
| | | | | | | | ±[IDENT] ‘br’
| | | | | | | | -[IDENT] ‘com’
| | | | | | | -[IDENT] ‘prodesan’
| | | | | | -[IDENT] ‘jprogestic’
| | | | | -[IDENT] ‘log’
| | | | -[IDENT] ‘LogAtributoAlteradoImpl’
| | | -[ALIAS] ‘atr’
| | -[JOIN] ‘join’
| | ±[IDENT] ‘ICImpl’
| | -[ALIAS] ‘ic’
| -[SELECT] ‘select’
| ±[IDENT] ‘atr’
| -[IDENT] ‘ic’
±[WHERE] ‘where’
| -[AND] ‘and’
| ±[EQ] ‘=’
| | ±[DOT] ‘.’
| | | ±[IDENT] ‘atr’
| | | -[IDENT] ‘atributo’
| | -[QUOTED_STRING] ‘‘localizacao’’
| -[OR] ‘or’
| ±[LIKE] ‘like’
| | ±[DOT] ‘.’
| | | ±[IDENT] ‘atr’
| | | -[IDENT] ‘valor_original’
| | -[QUOTED_STRING] ‘’%INFORMÁTICA%’’
| -[LIKE] ‘like’
| ±[DOT] ‘.’
| | ±[IDENT] ‘atr’
| | -[IDENT] ‘valor_alterado’
| -[QUOTED_STRING] ‘’%INFORMÁTICA%’’
-[ORDER] ‘order’
-[DOT] '.'
±[IDENT] ‘ic’
-[IDENT] ‘bp’

Obs.: Ele reclama de ic.bp, mas na classe ICImpl tem um atributo chamado bp e eu já uso o order by ic.bp em outros hql.
A classe logEntidadeAlterada é a única que contém o id do ICImpl.

E agora???

Agradeço desde já.

6 Respostas

bzy

A consulta funciona sem o order by?
Se estiver funcionando, veja a nomenclatura e verifique o get e o set.

tatianefernanda

Não, ela parou de funcionar no momento em que eu coloquei o ICImpl e o que queria dele.
Diretamente no banco, com mais alguns detalhes é claro, ela funciona perfeitamente.
Mas ainda não descobri o porque está dando erro. Vou verificar os get e set como vc disse.
Valeu. :slight_smile:

tatianefernanda

bzy, os get e set estão corretos!
E agora, tem idéia do que pode ser:?:
Até logo.

bzy

Então vamos ver.
Assim funciona:

sb.append("select atr from LogAtributoAlteradoImpl atr ");  
sb.append("where atr.atributo='localizacao' and (atr.valor_original like '%INFORMÁTICA%' or atr.valor_alterado like '%INFORMÁTICA%') ");

Se for isso, tente alterar o mapeamento do LogAtributoAlteradoImpl para que ele contenha o ICImpl e deixe o Hibernate gerenciar o join, se tudo der certo, você terá algo assim:

sb.append("select atr from LogAtributoAlteradoImpl atr ");  
sb.append("where atr.atributo='localizacao' and (atr.valor_original like '%INFORMÁTICA%' or atr.valor_alterado like '%INFORMÁTICA%') order by [b]atr.icimpl.bp[/b]");

Sendo que o icimpl é um objeto ICImpl na classe LogAtributoAlteradoImpl.

tatianefernanda

Assim provavelmente funcione, eu vou verificar. Obrigada! :slight_smile:
Antes vejamos a situação atual que esqueci de complementar…
Na classe LogAtributoAlteradoImpl eu tenho um objeto LogEntidadeAlteradaImpl, onde na classe LogEntidadeAlteradaImpl eu tenho um atributo chamado alteravel_id do tipo long. Este guarda o id do ICImpl, mas não é um objeto ICImpl.
Eu poderia fazer algo do tipo (exemplo em SQL) ?

select atr.*,ic.bp from logatributoalterado as atr
join logentidadealterada as ent join icimpl as ic
where atr.entidade_alterada_id=ent.id
and ent.alteravel_id=ic.id
and atr.atributo='localizacao'
and (atr.valor_original like '%INFORMÁTICA%' or atr.valor_alterado like '%INFORMÁTICA%')
order by ic.bp
bzy

Pelo que eu vi, o sistema já está implementado e parece que não usava Hibernate antes.
Se ficar mais fácil usar SQL que fazer alterações, cria o objeto Query usando createSQLQuey e use o addEntity.

...
hql = sessao.createSQLQuery("SELECT * FROM logatributoalterado").addEntity(logatributoalterado.class);
...

Então você teria um list com objetos logatributoalterado.

Se o SQL pegar apenas alguns campos ou várias tabelas, não use addEntity

Criado 18 de fevereiro de 2009
Ultima resposta 19 de fev. de 2009
Respostas 6
Participantes 2