Converter um Id de um Objeto de uma tabela X que esta na tabela Y em um tipo de String para visualização

7 respostas Resolvido
javawebmysqlbanco-de-dados
P

Olá pessoal , esperam que todos estejam bem, simplificando meu clímax cerebral eu criei duas tabelas no MySQL , a “tb_fabricantes” e “tb_modelos” que possuem um relacionamento 1:N
1

estou utilizando as informações do banco , dessas tabelas, para mostrar num dataTable , dividindo em colunas cada objeto e mostrando o valor de cada um deles :
tbFabricantes:

tbModelos:

como visto na “tbModelos” na coluna Fabricante nas 2 linhas se localizam os números “36” que equivalem ao Id do Objeto adicionado da “tbFabricante” (no caso , se voces prestarem atenção, Leeco) na tabela “tbModelos” .
Acontece que invés de aparecer o “36”(id do objeto da tabela fabricante) eu gostaria que aparecesse o nome do objeto da “tbFabricante” , ou seja, substituir o “36” por “Leeco”, como eu faria isso seguindo o modelo dos meu DAO’s :

DAO Modelo:

public class ModeloDAO {

        //INSTRUÇÃO SQL
        PreparedStatement  sql = conexao.prepareCall("SELECT * FROM tbmodelos");
        ResultSet rs = sql.executeQuery();
       
        List <Modelo> lstModelo = new ArrayList<>();
        while(rs.next())
        {
            Modelo modelo = new Modelo();
            modelo.setId(rs.getInt("id"));
            modelo.setModelo(rs.getString("modelo"));
            modelo.setFlash(rs.getBoolean("flash"));
            modelo.setFabricantes(rs.getInt("tbFabricantes_id")); //Aqui queria que invés de adicionar a ID , adicionar uma String com o nome do objeto
            modelo.setFoto(rs.getString("foto"));
            modelo.setTela(rs.getDouble("tela"));
        
         lstModelo.add(modelo);
        }
           
        return lstModelo;
       
        
        
    } catch (SQLException ex) {
       Logger.getLogger(ModeloDAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
    
        
   
}

}

DAO Fabricante:

public class FabricanteDAO {
        
        //INSTRUÇÃO SQL
        PreparedStatement  sql = conexao.prepareCall("SELECT * FROM tbfabricantes");
        ResultSet rs = sql.executeQuery();
        List <Fabricante> lstFabricantes = new ArrayList<>();
        
        while(rs.next())
        {
         Fabricante fabricante = new Fabricante();
         fabricante.setId(rs.getInt("id"));
         fabricante.setNome(rs.getString("nome"));
         fabricante.setPais(rs.getString("pais"));
         lstFabricantes.add(fabricante);
        }
        return lstFabricantes;
    } catch (SQLException ex) {
        Logger.getLogger(CellDAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
    
        
   
}

}

Aguardando uma reposta, muito obrigado!!

7 Respostas

M

Pablo,
A modelagem da sua entidade está incorreta. O seu modelo deve conter a entidade do fabricante e não o id dele. E para fazer a consulta de um modelo você precisaria fazer um fetch com a tabela de fabricante.

Se você estiver utilizando o hibernate esse link vai ter mais detalhes da modelagem das entidades.

D

ele não está usando hibernate, facilmente perceptível ao ler isso

Pois bem…
Você vai precisar fazer algumas mudanças na query e na lógica para ler os dados do banco.

SELECT * FROM tbmodelos m INNER JOIN tbfabricantes f ON f.id = m.tbfabricantes_id;

Isso trará todas as colunas das duas tabelas, desde que, você tenha modelos relacionados com fabricantes.

P

O inner join Não funcionou mas eu fiz assim
SELECT * FROM tbmodelos ,tbfabricantes WHERE tbmodelos.tbFabricantes_id = tbfabricantes.id;
E acrescentei a seguinte linha para setar os valores dentro do DAO:

modelo.setNome_fabricante(rs.getString("nome")); //"nome" é o nome do objeto Fabricante que queria que aparecesse
          com isso o resultado foi o seguinte:

Como visto agora não esta aparecendo mais o id do fabricante mas sim o nome (como é so pra visualização e o id dele é so pra uso interno não vi problema em fazer isso).
Bom, estou com outro problema na hora de salvar os dados (tem nada a ver com esse topico mas se puder me ajudar).

P

Bom esse projeto é um desafio, só posso usar JDBC nada de OEM

D
Solucao aceita

Isso cria um produto cartesiano. Para poucos resultados, tranquilo. Porém, aumentando a quantidade de registros, pode ocorrer lentidão.
Sugiro verificar o que significa o “não funcionou” para o inner join.

P

Bom consegui fazer rodar, agr meu problema é como faço pra salvar no banco, (porque eu até agora consegui inserir diretamente pelo MySQL) , o id do fabricante , sendo que preciso capturar seu Id para salvar ele e depois transforma-lo?

D

Cada SGBD (e o MySQL é um SGBE) possui um padrão próprio, porém, todos trabalham com o conceito de auto increment (no Oracle você cria sequences).
Esse recurso permite que você insira sem definir um ID.
Basta, ao criar a tabela, definir que a coluna que vai representar a chave primária (primary key) é do tipo auto increment

CREATE table tabela(
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    coluna1 VARCHAR(20),
    coluna2 FLOAT(10,2)
);

Apenas a chave primária pode ser auto increment.

Criado 16 de janeiro de 2020
Ultima resposta 22 de jan. de 2020
Respostas 7
Participantes 3