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: