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();
}
}