List 2 Tables in a Oriented Object

0

I have an academic job. and I'm not listing the DB data, or this is giving the error java.lang.NullPointerException I searched for something similar I found, I saw some examples but the form they use and creating the same attributes within the Products class itself, however I can not use that way

My Classes

Marca.java

public class Marca {

private long id;
private String nome;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

}

Product.Class

public class Produto {

private int id;
private String nome;
private double preco;
private Marca marca;

public Produto(String nome, Marca marca) {
    this.nome = nome;
    this.marca = marca;
}

public Produto() {
}

public long getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public Marca getMarca() {
    return marca;
}

public void setMarca(Marca marca) {
    this.marca = marca;
}

}

Product

 public List<Produto> consultarTodos() throws ClassNotFoundException, SQLException {

    Connection con = Conexao.getConnection();
    List<Produto> todosProdutos = new ArrayList<>();
    try (
            PreparedStatement ps = con.prepareStatement("SELECT a.nome,b.idProdutos,b.nomeProdutos FROM marca  as A , produtos  as B where a.id = b.idmarca")) {

        try (ResultSet rs = ps.executeQuery()) {

            while (rs.next()) {
                Produto p = new Produto();
                p.setId(rs.getInt("idProdutos"));
                p.getMarca().setNome(rs.getString("nome"));
                todosProdutos.add(p);
            }
        } catch (SQLException ex) {
            System.out.println("Erro: " + ex.getMessage());
            // ATENÇÃO: Comer exceções só dando um System.out.println nelas é uma má prática de programação!
        }
        return todosProdutos;

    }
}

Finally the JSP

       <c:forEach var="prod" items="${produtos}" >
                <tbody>
                    <tr>
                <ul class="list-group">

                    <th><li class="list-group-item">${prod.nome}</li></th>
                    <th><li class="list-group-item">${prod.marca.nome}</li></th>
                </ul>

                <th><td><input type="button" value="Atualizar" onclick="javascript: setIDAtualizar(${prod.id});"></td></th>
                <th><td><input type="button" value="Excluir" onclick="javascript: setIDExclusao(${prod.id});"></td></th>
                </tr>
                </tbody>

            </form>
        </thead>
    </c:forEach>

And the servlet

    ProdutoDAO dao = new ProdutoDAO();

    List<Produto> produto = null;
    try {
        produto = dao.consultarTodos();
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(BuscarProdutosController.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(BuscarProdutosController.class.getName()).log(Level.SEVERE, null, ex);
    }

    request.setAttribute("produtos", produto);
    request.getRequestDispatcher("/Controle/buscar/listaProdutos.jsp").forward(request, response);

}}
    
asked by anonymous 22.11.2017 / 12:13

1 answer

1

Your problem seems to be in the way that setting is the value for your brand object in your Produto p . When you give p.getMarca().setNome(rs.getString("nome")) , the markup object is nulo , it would be necessary to initialize the same first and then set the name.

Something very similar to what you did in your product would be:

p.setMarca(new Marca());
p.getMarca.setNome(rs.getString(1)); 
//nesse caso estou utilizando um índice para referência

See this example of using JDBC to obtain a list of database objects and to make a link to relational objects:

    
22.11.2017 / 13:11