GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

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

Tags: #<Tag:0x00007f9014af7930> #<Tag:0x00007f9014af77c8> #<Tag:0x00007f9014af7660>

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!!

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.

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.

1 Curtida

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).

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

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.

1 Curtida

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?

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.

//