1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como criar um Select que retorne os dados de 2 tabelas

Boa Noite, estou precisando de ajuda para fazer um select que retorne os dados de duas tabelas no meu JFrame, se alguém puder me ajudar fico grato faz 3 dias que estou tentando resolver este problema. Direto no banco funciona porém no meu projeto não funciona.

mysql> desc cliente;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| idCliente  | int(11)     | NO   | PRI | NULL    | auto_increment |
| cep        | int(11)     | NO   | MUL | NULL    |                |
| cnpj       | varchar(15) | YES  |     | NULL    |                |
| nome       | varchar(40) | YES  |     | NULL    |                |
| telefone   | varchar(15) | YES  |     | NULL    |                |
| celular    | varchar(15) | YES  |     | NULL    |                |
| email      | varchar(40) | YES  |     | NULL    |                |
| sexo       | varchar(1)  | YES  |     | NULL    |                |
| nascimento | varchar(10) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

mysql> desc endereco;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| idEndereco | int(11)     | NO   | PRI | NULL    | auto_increment |
| cep        | varchar(9)  | NO   |     | NULL    |                |
| cidade     | varchar(30) | NO   |     | NULL    |                |
| bairro     | varchar(30) | NO   |     | NULL    |                |
| tipo       | varchar(20) | NO   |     | NULL    |                |
| rua        | varchar(40) | NO   |     | NULL    |                |
| estado     | varchar(2)  | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

    private void listarCep() throws ClassNotFoundException, SQLException {

        TelaClienteDao dao = new TelaClienteDao();
        telas = dao.getLista(jFPesquisa.getText());
        mostraPesquisa(telas);
    }

    private void jTTabelaLinhaSelecionada(JTable tabela) {

        if (jTTabela.getSelectedRow() != -1) {
            //habilitaCampos();
            jTIdEndereco.setText(String.valueOf(telas.get(tabela.getSelectedRow()).getIdEndereco()));
            jTId.setText(String.valueOf(telas.get(tabela.getSelectedRow()).getIdCliente()));
            jFCep.setText(telas.get(tabela.getSelectedRow()).getCep());
            jTCnpj.setText(telas.get(tabela.getSelectedRow()).getCnpj());
            jTNome.setText(telas.get(tabela.getSelectedRow()).getNome());
            jFTelefone.setText(telas.get(tabela.getSelectedRow()).getTelefone());
            jFCelular.setText(telas.get(tabela.getSelectedRow()).getCelular());
            jTEmail.setText(telas.get(tabela.getSelectedRow()).getEmail());
            jTSexo.setText(telas.get(tabela.getSelectedRow()).getSexo());
            jFNascimento.setText(telas.get(tabela.getSelectedRow()).getNascimento());
            jTCidade.setText(telas.get(tabela.getSelectedRow()).getCidade());
            jTBairro.setText(telas.get(tabela.getSelectedRow()).getBairro());
            jCTipo.setSelectedItem(telas.get(tabela.getSelectedRow()).getTipo());
            jTRua.setText(telas.get(tabela.getSelectedRow()).getRua());
            jTEstado.setText(telas.get(tabela.getSelectedRow()).getEstado());
        } else {
            jTId.setText("");
            jFCep.setText("");
            jTCnpj.setText("");
            jTNome.setText("");
            jFTelefone.setText("");
            jFCelular.setText("");
            jTEmail.setText("");
            jTSexo.setText("");
            jFNascimento.setText("");
            jTCidade.setText("");
            jTBairro.setText("");
            jCTipo.setSelectedItem("");
            jTRua.setText("");
            jTEstado.setText("");
        }
    }

    private void mostraPesquisa(List<TelaCliente> telas) {

        while (tmTela.getRowCount() > 0) {
            tmTela.removeRow(0);
        }
        if (telas.size() == 0) {
            JOptionPane.showMessageDialog(null, "Nenhum cep cadastrado!");
        } else {
            String[] linha = new String[]{null, null, null, null, null, null,null,
                null,null, null, null, null, null,null,null};
            for (int i = 0; i < telas.size(); i++) {
                tmTela.addRow(linha);
                tmTela.setValueAt(telas.get(i).getCep(), i, 0);
                tmTela.setValueAt(telas.get(i).getCnpj(), i, 1);
                tmTela.setValueAt(telas.get(i).getNome(), i, 2);
                tmTela.setValueAt(telas.get(i).getTelefone(), i, 3);
                tmTela.setValueAt(telas.get(i).getCelular(), i, 4);
                tmTela.setValueAt(telas.get(i).getEmail(), i, 5);
                tmTela.setValueAt(telas.get(i).getSexo(), i, 6);
                tmTela.setValueAt(telas.get(i).getNascimento(), i, 7);
                tmTela.setValueAt(telas.get(i).getCidade(), i, 8);
                tmTela.setValueAt(telas.get(i).getBairro(), i, 9);
                tmTela.setValueAt(telas.get(i).getTipo(), i, 10);
                tmTela.setValueAt(telas.get(i).getRua(), i, 11);
                tmTela.setValueAt(telas.get(i).getEstado(), i, 12);
                tmTela.setValueAt(telas.get(i).getIdCliente(), i, 13);
                tmTela.setValueAt(telas.get(i).getIdEndereco(), i, 14);
            }
        }
    }

public class TelaClienteDao {

    private Connection conexao;

    public TelaClienteDao() throws ClassNotFoundException, SQLException{

        this.conexao = CriaConexao.getConexao();

    }

    public List<TelaCliente> getLista(String Cep) throws SQLException {

        String sql = "select * from endereco, cliente"
                + "endereco.idEndereco = cliente.cep"
                + "where cliente.cep = ?";

           PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, Cep);
        ResultSet rs = stmt.executeQuery();

        List<TelaCliente> minhaLista = new ArrayList<TelaCliente>();

        while (rs.next()) {

            TelaCliente tl1 = new TelaCliente();

            tl1.setIdCliente(Long.valueOf(rs.getString("IdCliente")));
            tl1.setIdEndereco(Long.valueOf(rs.getString("IdEndereco")));
            tl1.setCep(rs.getString("cep"));
            tl1.setCnpj(rs.getString("cnpj"));
            tl1.setNome(rs.getString("nome"));
            tl1.setTelefone(rs.getString("telefone"));
            tl1.setCelular(rs.getString("celular"));
            tl1.setEmail(rs.getString("email"));
            tl1.setSexo(rs.getString("sexo"));
            tl1.setNascimento(rs.getString("nascimento"));
            tl1.setCidade(rs.getString("cidade"));
            tl1.setBairro(rs.getString("bairro"));
            tl1.setTipo(rs.getString("tipo"));
            tl1.setRua(rs.getString("rua"));
            tl1.setEstado(rs.getString("estado"));
            minhaLista.add(tl1);
        }
        rs.close();
        stmt.close();
        return minhaLista;
    }
}
  • Por que você possui um campo cep na tabela cliente? quando você chama o método rs.getString("cep") não é possível saber qual campo você pretende recuperar, da tabela cliente ou da tabela endereco.

    Anderson Eleuterio   23 de set de 2014
  • Sua query está por demais estranha. Primeiro: você não fez a ligação da forma correta. Segundo: você está ligando o campo CEP da tabela CLIENTE com o campo IDENDERECO da tabela ENDERECO, isso não faz sentido algum.

    electus   24 de set de 2014
  • FCCD, desse modo o cliente só poderá ter um único endereço. A melhor solução é adicionar o IDCLIENTE na tabela ENDERECO.

    electus   24 de set de 2014
  • Sim, tem razão. Eu "escolhi" essa solução pelo fato de afetar menos o modelo já existente. Bastaria adicionar uma chave estrangeira na tabela ENDERECO. Fazendo relação N:N teria que ser criada outra tabela ligando CLIENTE_ENDERECO. Mas realmente seria a melhor solução, pelo fato de um endereço poder ser igual para dois clientes diferentes.

    electus   24 de set de 2014
  • É complicado. Muitas vezes o pessoal faz uma pergunta e fica dias sem aparecer pra responder aos questionamentos.

    electus   24 de set de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

4 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java mysql netbeans ou faça a sua própria pergunta.