Problemas para usar inner join com o jdbc[RESOLVIDO]

11 respostas
marcoslogan

Galera eu esto com um probleminha num projeto para a faculdade.
No projeto me deparei com uma situação que tenho que fazer o inner join tentei tudo e não está dando certo.

Vou postar o código para vocês analisarem:

String sql = "Select enderecos.cep, tp_logradouro.descricao, bairros.descricao, cidades.descricao, enderecos.uf" 
                     +"inner join tp_logradouro on tp_logradouro.codigo = enderecos.codigo" 
                     + "inner join bairros on bairros.codigo = enderecos.cod_bairro" 
                     +"inner join cidades on cidades.codigo = endereco.cod_cidade";
   smt = con.prepareStatement(sql);//smt é um PreparedStatement e con é um Connection

   Endereco endereco;//O problema que está dando é no endereço que tenho que carregar todos os dados do endereço. O meu projeto é um software para uma transportadora.
   try{
       set = smt.executeQuery();//set é um Resultset. Dá pau nessa linha. Eu não sei o que está errado.

       while(set.next()){//ele nem chega nessa linha
                endereco = new Endereco();
                
                endereco.setCep(set.getString("cep"));
                endereco.setCodigo(set.getInt("codigo"));
                endereco.setUf(set.getString("uf"));
                endereco.getBairro().setCodigoBairro(set.getInt("cod_bairro"));
                endereco.getCidade().setCodigo(set.getInt("cod_cidade"));
                endereco.getTipoLogradouro().setCodigo(set.getInt("cod_tp_logradouro"));
                endereco.getTipoLogradouro().setDescricao(set.getString("logradouro"));
                
                enderecos.add(endereco);
       }
   }catch(SQLException ex){//Minha exceção}

Será que alguém poderia me ajudar nessa?

11 Respostas

A

Olá marcos,

verifique se no seu SQL a variável (tp_logradouro.codigo) é representada na tabela de endereço pela variável (enderecos.codigo) pois seguindo seu padrão de nomenclatura talvez ela tem que ser representada pela variável (enderecos.cod_tp_logradouro).
cuide também com os espaços ao final de cada linha antes de fechar as aspas duplas, deve haver um espaço antes de fecha-las … por exemplo:

String sql = "Select enderecos.cep, tp_logradouro.descricao, bairros.descricao, cidades.descricao, enderecos.uf "   
                  +"inner join tp_logradouro on tp_logradouro.codigo = enderecos.codigo "   
                  + "inner join bairros on bairros.codigo = enderecos.cod_bairro "   
                  +"inner join cidades on cidades.codigo = endereco.cod_cidade";

espero ter ajudado!!

marcoslogan

Como assim? Você poderia me explicar melhor?

A

Opa,

na sua tabela de endereço … qual o nome da chave estrangeira (foreign key) que é usada para a ligação com a tabela tp_logradouro?
essa variável vc tem que colocar nesse trecho:

pois acredito que a variável endereço.codigo se refere ao código do endereço e não ao codigo do tipo de logradouro.
não sei como está seu banco de dados mas pelo que me parece é isso…
lembre-se de adicionar um espaço no final de cada linha do seu sql … para que o compilador de comandos sql entenda o que foi digitado

espero ter ajudado

marcoslogan

me desculpa eu errei. Não é assim que está no código.

veja só.

String sql = "select enderecos.cep, tp_logradouro.descricao, bairros.descricao, cidades.descricao, enderecos.uf from enderecos"
                + " inner join tp_logradouro on tp_logradouro.codigo = enderecos.cod_tp_logradouro "
                + "inner join bairros on bairros.codigo = enderecos.cod_bairro "
                + "inner join cidades on cidades.codigo = enderecos.cod_cidade";

Esse é o código correto. É que eu estava fazendo na mão.

A

Ok, então tente fazer isso:

verifique se seus imports são do pacote java.sql

caso o erro continue poste seu erro para que possamos saber como resolver…

ViniGodoy

O INNER JOIN vai exigir que existam dados nas duas tabelas para que um registro apareça no resultado.

Portanto, seu endereço necessariamente terá que estar preenchido com bairro e cidade.
Se você quiser listar o dado caso um registro simplesmente exista na tabela enderecos, use no lugar um LEFT JOIN:

String sql = "SELECT enderecos.cep, tp_logradouro.descricao, bairros.descricao, cidades.descricao, enderecos.uf FROM enderecos "
                + "LEFT JOIN tp_logradouro on tp_logradouro.codigo = enderecos.cod_tp_logradouro "
                + "LEFT JOIN bairros on bairros.codigo = enderecos.cod_bairro "
                + "LEFT JOIN cidades on cidades.codigo = enderecos.cod_cidade";

Tópico movido para o fórum de persistência.

ViniGodoy

Outra coisa, nunca, mas nunca mesmo, faça isso aqui:

Você está “engolindo” a mensagem de erro, o que vai deixar MUITO mais difícil de identificar o problema, e de descreve-lo para o pessoal do GUJ.

No lugar, no mínimo, faça isso aqui:

E então, poste o texto de stack trace que sai no console no aqui no fórum. Para melhores detalhes, leia:

marcoslogan

Blz. me desculpe eu não sabia. Da próxima vez eu colocarei. Mas no caso é inner join mesmo. Pois já está cadastrado na tabela enderecos.

ViniGodoy

Então arruma o catch e posta a mensagem do erro.

marcoslogan

Mas eu já resolvi. Mas mesmo assim obrigado a todos que postaram.

ViniGodoy

Então explique o que estava errado e posta a solução no GUJ. Assim o tópico fica completo (outros podem ter o mesmo problema que você no futuro).

Criado 27 de outubro de 2012
Ultima resposta 28 de out. de 2012
Respostas 11
Participantes 3