ProdutoDAO { public BigDecimal somaPrecosPorTipo(TipoPreco tipoPreco) { TypedQuery<BigDecimal> query = manager .createQuery("select sum(preco.valor) from Produto p " + " join p.precos preco where preco.tipo = :tipoPreco", BigDecimal.class); query.setParameter("tipoPreco", tipoPreco); return query.getSingleResult(); }  void gravar(Produto produto); List<Produto> listar(); Produto find(Integer id); BigDecimal somaPrecosPorTipo(TipoPreco tipoPreco);  }
@Test @Transactional public void deveSomarTodosPrecosPorTipoLivro() { List<Produto> livrosImpressos = ProdutoBuilder .newProduto(TipoPreco.IMPRESSO, BigDecimal.TEN) .mais(3).buildAll(); List<Produto> livrosEbook = ProdutoBuilder .newProduto(TipoPreco.EBOOK, BigDecimal.TEN) .mais(3).buildAll(); livrosImpressos.stream().forEach(produtoDao::gravar); livrosEbook.stream().forEach(produtoDao::gravar); BigDecimal valor = produtoDao.somaPrecosPorTipo(TipoPreco.EBOOK); Assert.assertEquals(new BigDecimal(40).setScale(2), valor); }