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

Não estou sabendo entender e resolver essa exception. Help? Obrigada!

Após executar todos os comandos da aula, meu código está compilando mas estou com essa exception... Alguém pode me ajudar a entender e resolver isso?

Exception in thread "main" javax.persistence.NoResultException: No entity found for query
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1643)
    at br.com.alura.loja.dao.ProdutoDao.buscarPrecoDoProdutoComNome(ProdutoDao.java:68)
    at br.com.alura.loja.testes.CadastroDeProdutos.main(CadastroDeProdutos.java:29)

CadastroDeProdutos:

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(p2.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("Xiomi 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();
    }
}

ProdutoDao:

public class ProdutoDao {
    private EntityManager em; 
        public ProdutoDao(EntityManager em) {
        this.em = em;
    }    
    public void cadastrar(Produto produto) {
        this.em.persist(produto);        
    }    
    public void atualizar(Produto produto) {
        this.em.merge(produto);
    }
    public void remover(Produto produto) {
        produto = em.merge(produto);
        this.em.remove(produto);
    }    
    public Produto buscarPorId(Long id) {
        return em.find(Produto.class, id);
    }    
    public List<Produto> buscarTodos() { 
        String jpql = "SELECT p FROM Produto p"; 
        return em.createQuery(jpql, Produto.class).getResultList();
    }
    public List<Produto> buscarPorNome(String nome) { 
        String jpql = "SELECT p FROM Produto p WHERE p.nome = :nome"; 
        return em.createQuery(jpql, Produto.class)
                .setParameter("nome", nome) 
                .getResultList(); 
    }    
    public List<Produto> buscarPorNomeDaCategoria(String nome) { //busca filtro por categoria/relacionamento
        String jpql = "SELECT p FROM Produto p WHERE p.categoria.nome = :nome"; 
        return em.createQuery(jpql, Produto.class)
                .setParameter("nome", nome)
                .getResultList(); 
    }    
    public BigDecimal buscarPrecoDoProdutoComNome(String nome) {
        String jpql = "SELECT p.preco FROM Produto p WHERE p.nome = :nome";
            return em.createQuery(jpql, BigDecimal.class)
                        .setParameter("nome", nome)
                        .getSingleResult();
        }
}        

CategoriaDao:

public class CategoriaDao {
    private EntityManager em;     
    public CategoriaDao(EntityManager em) {
        this.em = em;
    }
    public void cadastrar(Categoria categoria) {
        this.em.persist(categoria);
    }    
    public void atualizar(Categoria categoria) {
        this.em.merge(categoria);  
    }
    public void remover(Categoria categoria) {
        categoria = em.merge(categoria);
        this.em.remove(categoria);
    }
}

Obrigada :')

7 respostas

Oi Vanessa,

O erro: NoResultException: No entity found for query

A sua consulta não encontrou registro e a JPA lança exception por conta disso. No caso foi o seu método buscarPrecoDoProdutoComNome, então você deve ter passado um nome que não está cadastrado no banco de dados. Confere isso.

Professor,

Os erros desapareceram, porém agora, por algum motivo ao inserir um produto na tabela a categoria aparece como NULL, embora eu a passe como parâmetro.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

na verdade ele salvou sim, o id da categoria na coluna categoria_id.

essa coluna categoria deve ser de antes da cetegoria ser uma entidade e acabou ficando na tabela.

Mas não deveria aparecer escrito CELULARES ao invés de NULL?

solução!

Na verdade não. é para gravar o id da categoria na coluna categoria_id, que na sua tabela está o id 28, e na tabela de categorias ter a categoria de id 28 com nome CELULARES.

Posso excluir essa coluna 'categoria' pelo terminal sem problemas então, né?

Pode sim!

O hbm2ddl.auto não apaga tabelas e colunas, apenas cria novas quando adicionamos novas entidades ou novos atributos em entidades.