Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] sobre aula 05.Consultas JPQL

Gostaria de uma ajuda . Quando compilo do código da uma exception dizendo que p é null então não pode chamar get.preco(). esse Produto p = produtoDao.buscarPorId(1l); ele não precisava ser instanciado primeiro antes de chamar esse metodo ?

por que eu preciso fazer EntityManager em = JPAUtil.getEntityManager(); ProdutoDao produtoDao = new ProdutoDao(em); para começar uma consulta ? Estou com essas dúvidas podem me ajudar .

codigo é esse `public class CadastroDeProdutos {

public static void main(String[] args) {
    cadastrarProduto();
    EntityManager em = JPAUtil.getEntityManager();
    ProdutoDao produtoDao = new ProdutoDao(em);
    Produto p = produtoDao.buscarPorId(1l);
    System.out.println(p.getPreco());

    List<Produto> todos = produtoDao.buscarPorNomeDaCategoria("CELULARES");
    todos.forEach(p2 -> System.out.println(p.getNome()));

    BigDecimal precoDoProduto = produtoDao.buscarPrecoDoProdutoComNome("Xiaomi Redmi");
    System.out.println("Preco do Produto: " + precoDoProduto);
}

private static void cadastrarProduto() {
    Categoria celulares = new Categoria("CELULARES");
    Produto celular = new Produto("Xiaomi Redmi", "Muito legal", new BigDecimal("800"), celulares);

    EntityManager em = JPAUtil.getEntityManager();
    ProdutoDao produtoDao = new ProdutoDao(em);
    CategoriaDao categoriaDao = new CategoriaDao(em);

    em.getTransaction().begin();

    categoriaDao.cadastrar(celulares);
    produtoDao.cadastrar(celular);

    em.getTransaction().commit();
    em.close();
}

`

3 respostas

p é null porque provavelmente não foi encontrado no banco um produto com id 1, ou tem alguma coisa errada no método buscarPorId da sua classe ProdutoDao, dá uma conferida. E sobre o porque de usar EntityManager em = JPAUtil.getEntityManager(); ProdutoDao produtoDao = new ProdutoDao(em); antes da consulta é que não tem como fazer sem, porque o método que a gente faz a consulta é esse "buscarPorId" que está na classe ProdutoDao, e para nós instanciarmos essa classe precisamos passar no construtor dele um EntityManager (que é um atributo da classe).

Mudei no banco realmente nao tinha id 1. Minha dúvida é Quando uso Produto p = produtoDao.buscarPorId(1l); porque posso chamar depois System.out.println(p.getPreco()); se p não foi instanciado .

solução!

Você pode chamar p.getPreco porque esse método getPreco existe na classe Produto, logo, você pode usar em qualquer momento, é o comportamento normal, até porque no momento que estamos escrevendo o código não tem como o Java saber se p é null ou não, o problema só aparece em tempo de execução. Ai você pode fazer alguma validação no método que busca do banco para lançar uma Exception caso o resultado for null, aí fica a seu critério. Nas consultas não fazemos a instanciação da classe (igual fizemos com JDBC), como falou, porque o próprio Hibernate faz isso por debaixo dos panos, a gente só precisa colocar pra ele a classe que vamos buscar