Consulta em mais de 3 ou mais tabelas relacionadas

Estou desenvolvendo uma aplicação em Java Web e tenho duas ou mais tabelas relacionadas onde passo a resumir de forma ilustrativa:

USUARIO


COD
NOME
BAIRROCOD
EMAIL
STATUS

BAIRRO


BAIRROCOD
NOMEBAIRRO

Onde há um relacionamento entre as tabelas USUARIO e BAIRRO através de BAIRROCOD. Preciso já tenho a consulta SQL na Aplicacao jsp, porém quando realizar a consulta gostaria de ter o seguinte:

USUARIO


COD
NOME
NOMEBAIRRO (ao inves do BAIRROCOD)
EMAIL
STATUS

Segue MembroDao.java, porém quando roda ele retorna para a tela principal e não realiza a consulta.

package br.com.syschurch.jdbc.dao;

import br.com.syschurch.jdbc.javabeans.Membro;
import br.com.syschurch.jdbc.factory.ConnectionFactory;
import br.com.syschurch.jdbc.interfaces.MembroInterface;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MembroDao implements MembroInterface {

    private Connection connection;
    private List<Membro> listaMembro = new ArrayList<Membro>();

    public MembroDao() {
        this.connection = new ConnectionFactory().getConnection();
    }

    public List<Membro> listarMembro(Membro membro) throws SQLException {

        List<Membro> listaMembro = new ArrayList<Membro>();

        try {
                String sql = "select a.idtb_member, a.tb_membername, a.tb_memberendereco, b.tb_bairroname FROM tb_member a JOIN tb_bairro b    ON a.tb_bairro_idtb_bairro = b.idtb_bairro
                WHERE tb_membername LIKE '%" + membro.getTb_membername() + "%'";
            
            PreparedStatement ps = connection.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();

            while (resultSet.next()) {

                Membro membros = new Membro();
                membros.setIdtb_member(resultSet.getInt("idtb_member"));
                membros.setTb_membername(resultSet.getString("tb_membername"));
                membros.setTb_memberendereco(resultSet.getString("tb_memberendereco"));
                membros.setTb_bairroname(resultSet.getString("tb_bairroname"));

                listaMembro.add(membros);
            }
            ps.close();
            connection.close();
            resultSet.close();

        } catch (Exception erro) {
            throw new RuntimeException(erro);
        }
        return listaMembro;
    }

Segue arquivo JSP

Uma dica para tornar a modelagem mais didática, Bairro não adequaria como uma entidade, e sim como um atributo, Criando as entidades desta forma >>>

CADASTRO


  • Cod_cad
  • Nome
  • Sobrenome
  • Email
  • Status

ENDERECO


  • Cod_cad
  • Nome_cidade
  • Nome_bairro
  • Nome_cep
  • Nome_logradouro

Podes usar cod_cad como chave estrangeira.

Marcelinuuuu_Bk, obrigado pela dica… coloquei Bairro como entidade pra evitar que sejam digitados nomes de Bairros de quaisquer maneiras, onde no futuro poderemos agrupar informações estatísticas por bairro.

1 curtida

Consegui realizar a consulta utilizando duas tabelas relacionadas, porém quando incluo uma terceira… utilizando a mesma notação simplesmente ele não realiza… retornando para a tela inicial do sistema. Certamente é um desafio de programação, pois ainda tenho mais 4 tabelas para incluir a consulta relacionada.

MembroDAO.java

public List<Membro> listarMembro(Membro membro) throws SQLException {

    List<Membro> listaMembro = new ArrayList<Membro>();

    try {

        String sql = "SELECT t1.*, t2.*, t3.* FROM tb_member t1 JOIN tb_bairro t2 ON t1.tb_bairro_idtb_bairro = t2.idtb_bairro JOIN tb_cidade t3 ON t1.tb_cidade_idtb_cidade = t3.idtb_cidadeWHERE t1.tb_membername LIKE '%" + membro.getTb_membername() + "%'";
        
        PreparedStatement ps = connection.prepareStatement(sql);
        ResultSet resultSet = ps.executeQuery();

        while (resultSet.next()) {

            Membro membros = new Membro();
            Bairro bairro = new Bairro();
            Cidade cidade = new Cidade();

            membros.setIdtb_member(resultSet.getInt("idtb_member"));
            membros.setTb_membername(resultSet.getString("tb_membername"));
            membros.setTb_memberendereco(resultSet.getString("tb_memberendereco"));                
            bairro.setTb_bairroname(resultSet.getString("tb_bairroname"));
            cidade.setTb_cidadename(resultSet.getString("tb_cidadename"));
            membros.setBairro(bairro);
            membros.setCidade(cidade);                
            listaMembro.add(membros);
        }
        ps.close();
        connection.close();
        resultSet.close();

    } catch (Exception erro) {
        throw new RuntimeException(erro);
    }
    return listaMembro;
}

Tente executar o código SQL diretamente no banco de dados manualmente e verifica se retorna algum valor, pois aparentemente não há erro no [quote=“wendell.clive, post:4, topic:348423”]
String sql = “SELECT t1., t2., t3.* FROM tb_member t1 JOIN tb_bairro t2 ON t1.tb_bairro_idtb_bairro = t2.idtb_bairro JOIN tb_cidade t3 ON t1.tb_cidade_idtb_cidade = t3.idtb_cidadeWHERE t1.tb_membername LIKE '%” + membro.getTb_membername() + “%’”;
[/quote]

Esquece o que eu disse acima, o erro está no seu String sql, note que você não colocou um espaço entre t3.idtb_cidade e o WHERE, fazendo assim que interprete de maneira errada.

1 curtida

Rodrigomarden obg pela dica… uma coisa tão simples que passou desapercebido.
Resolveu 100%.