Dúvida com Hibernate HQL (Urgente... )

2 respostas
R

Opa galera…

Eu possuo duas tabelas em meu BD, onde eu devo recuperar os dados para serem exibidos ao usuário. As tabelas são as seguintes…

LocalidadeLogradouro:
codLocali ( código da localidade, chave extrangeira de outra tabela )
codLograd ( número sequencial do logradouro )
desLograd ( Nome do logradouro )
numCep ( número do cep do logradouro )
codBairroInicia ( Bairro em que o logradouro inicia, mesmo valor da coluna codBairro da tabela LocalidadeBairro )
codBairroFinal ( bairro em que o logradouro termina, mesmo valor da coluna codBairro da tabela LocalidadeBairro )

LocalidadeBairro:
codLocali ( código da localidade, chave extrangeira… )
codBairro ( código sequencial para os bairros )
nomBairro ( Nome do Bairro )
nomSintetBairro ( Nome sintético para o bairro )

Em um HQL eu devo retornar: codLograd, desLograd, numCep, nomBairro ( sendo este o nome do bairro em que o logradouro inicia… )

Utilizando o seguinte comando HQL: select log.id.codLograd, log.desLograd, log.numCepLograd, bai.nomBairro from LocalidadeLogradouro log, LocalidadeBairro bai where log.id.codLocali=:codLocali and log.id.codLograd=:codLograd and log.codBairroInicia = bai.id.codBairro

Eu consigo recuperar exatamente o que eu quero. Isto quando o registro de LocalidadeLogradouro possui a informação de qual é o bairro em que ele inicia.

Tendo em vista de que alguns registros não possuem tal informação, quando eu tento recupera-los eu não recebo nada como retorno, pois a ultima clausula WHERE não é satisfeita.

Eu quero que: quando codBairroInicia for igual a 0, recupera os outros dados e retorna NULL na coluna nomBairro. Caso codBairroInicia seja diferente de 0, recuperar todos os dados.

Alguem sabe como fazer isto ?
Tentei usar os joins mais devo estar fazendo alguma coisa errada pois eles não funcionam.

Aguardo respostas…

Obrigado.
Rodrigo Kerkhoff

2 Respostas

F

Olá Rodrigo,

Tente fazer usando “LEFT JOIN”, alterando o HQL da seguinte maneira:

Em vez de:

FROM LocalidadeLogradouro log, 
         LocalidadeBairro bai

Use:

FROM LocalidadeLogradouro log, LEFT JOIN LocalidadeBairro bai ON (log.codBairroInicia = bai.id.codBairro)

E remova esta parte na clausula WHERE:

AND log.codBairroInicia = bai.id.codBairro

O ‘LEFT JOIN’ irá trazer tudo que tem em ‘log’ existindo ou nao registro relacionado em ‘bai’.

Té+

R

hummm obrigado pela resposta…

Eu consegui arrumar o problema modificando meu mapeamento do hibernate e também havia uma constraint errada no BD…

Mais deste jeito que você falou é exatamente o que eu queria…

Valeu =]

Criado 16 de maio de 2007
Ultima resposta 18 de mai. de 2007
Respostas 2
Participantes 2