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

javax.persistence.NoResultException: No entity found for query

Bom dia

Estou recebendo uma javax.persistence.NoResultException: No entity found for query no método public BigDecimal buscarPrecoDoProdutoComNome(String nome), mas não compreendo por que. Qual seria o problema?

Seguem os códigos da classe de teste e da classe DAO:

public class ProdutoDAO {

    private EntityManager em;

    public ProdutoDAO(EntityManager em) {
        this.em = em;
    }

    public void cadastrar(Produto produto) {
        this.em.persist(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> buscarPorCategoria(String nome){
        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.categoria.nome = :nome";
            return em.createQuery(jpql, BigDecimal.class)
                        .setParameter("nome", nome)
                        .getSingleResult();
        }



}
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.buscarTodos();
        todos.forEach(p2 -> System.out.println(p.getNome()));

        List<Produto> nomes = produtoDao.buscarPorNome("Xiaomi Redmi");
        nomes.forEach(p2 -> System.out.println(p.getNome()));

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

        BigDecimal precoDoProduto = produtoDao.buscarPrecoDoProdutoComNome("Xiaomi Redmi");
        System.out.println("Preço = " + precoDoProduto);

    }

    private static void cadastrarProduto() {
        Categoria celulares = new Categoria("CELULARES");

        Produto cel = new Produto("Xiaomi Redmi", "Muito legal", new BigDecimal("800"), celulares);

        EntityManager em = JPAUtil.getEntityManager();
        CategoriaDAO categoriaDao = new CategoriaDAO(em);
        ProdutoDAO produtoDao = new ProdutoDAO(em);

        em.getTransaction().begin();

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

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

}
2 respostas
solução!

Oi Frederico,

Seu método buscarPrecoDoProdutoComNome na verdade está buscando pelo nome da categoria e não do produto. Por isso não encontra nenhum registro no banco e lança a exception.

Bons estudos!

Boa tarde Rodrigo

Comi mosca rsss. Mas valeu demais.

Gostei muito do treinamento, didática excelente.

Um feliz natal e um 2022 repleto de realizações!