1
resposta

Faça como eu fiz

Classe 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);
        
        List<Produto> todos = produtoDAO.buscarTodos();
        todos.forEach((p2) -> {
            System.out.println(p2);
        });
         
        List<Produto> todos2 = produtoDAO.buscarPorNome("Xiaomi Redmi");
        todos2.forEach((p2) -> {
            System.out.println(p2);
        });
         
        List<Produto> todos3 = produtoDAO.buscarPorNomeDaCategoria("CELULARES");
        todos3.forEach((p2) -> {
            System.out.println(p2);
        });
         
        BigDecimal precoDoProduto = produtoDAO.buscarPrecoDoProdutoComNome("Xiaomi Redmi");
        System.out.println(precoDoProduto);
    }
}

Classe ProdutoDAO:

    //...
    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) {
        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)
                .setMaxResults(1)
                .getSingleResult();
    }

No método buscarPrecoDoProdutoComNome(String nome) obtive o seguinte erro:

Exception in thread "main" javax.persistence.NonUniqueResultException: query did not return a unique result: 5

E a solução para não retornar mais de um resultado na consulta, foi acrescentar o método .setMaxResults(1), para limitar a consulta em apenas um resultado.

Log:

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

1 resposta

Oi, Anderson! Tudo bem?

Ótimas soluções, parabéns pela dedicação e elaboração deles! Obrigada também por tê-las compartilhado com a nossa comunidade do fórum, tenho certeza que ajudará muitos colegas! Caso surja alguma dúvida, sinta-se à vontade em comunicar por aqui, estou à disposição e ficarei super feliz em poder ajudar!

Um forte abraço e bons estudos!