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:
Stringsql="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 ConnectionEnderecoendereco;//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 linhaendereco=newEndereco();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(SQLExceptionex){//Minha exceção}
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
AlanRS
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
AlanRS
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).