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

Consulta de dois atributos da mesma entidade e o resultado de mais de um registro

Boa tarde,

no curso, para a busca de um só atributo da entidade com o resultado de um registro do banco de dados o exemplo ficaria assim:

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

mas se eu quisesse trazer dois atributos da mesma entidade e o resultado fosse mais de um registro do banco de dados: SELECT p.nome, p.preco FROM Produto p WHERE p.preco > :preco

eu teria que criar algo parecido com a classe RelatorioDeVendasVo?

abraço.

4 respostas

Oi Ricardo,

Nunca cheguei a testar, mas acredito que voce pode criar um construtor na propria entidade Produto e fazer o select new nela:

SELECT new br.com.alura.loja.modelo.Produto(p.nome, p.preco) FROM Produto p WHERE p.preco > :preco
public class Produto {

    // atributos...

    public Produto() {}

    public Produto(String nome, BigDecimal preco) {
        this.nome = nome;
        this.preco = preco;
    }

    // metodos...
}

ok,

fiz o seguinte:

na classe Produto:

@NamedQuery(name="Produto.precosDosProdutosComNomes", query = "SELECT new br.com.alura.loja.modelo.Produto(p.nome, p.preco) FROM Produto p WHERE p.preco > :preco")
public class Produto {

// atributos

   public Produto(String nome, BigDecimal preco) {
        this.nome = nome;
        this.preco = preco;
    }

na classe ProdutoDao:

    public List<Produto> buscarPrecosDosProdutosComNomes(BigDecimal preco) {   
        return em.createNamedQuery("Produto.precosDosProdutosComNomes", Produto.class).setParameter("preco", preco).getResultList();
    }

mas na classe CadastroDeProdutos dá erro de compilação na chamada para impressão:

        List<Produto> porPrecosDosProdutosComNomes = produtoDao.buscarPrecosDosProdutosComNomes(BigDecimal("100"));

The method BigDecimal(String) is undefined for the type CadastrDeProduto

        porPrecosDosProdutosComNomes.forEach(p2 -> System.out.println(p.getNome(), p.getPreco()));

The method println(String) in the type PrintStream is not applicable for the arguments (String, BigDecimal)

obrigado pela força!

Nessa linha:

List<Produto> porPrecosDosProdutosComNomes = produtoDao.buscarPrecosDosProdutosComNomes(BigDecimal("100"));

Ta faltando o new para criar o BigDecimal:

List<Produto> porPrecosDosProdutosComNomes = produtoDao.buscarPrecosDosProdutosComNomes(new BigDecimal("100"));

Veja se o problema é esse.

solução!

Olá Rodrigo,

sim, funcionou!

alterei também a linha de impressão para:

        porPrecosDosProdutosComNomes.forEach(System.out::println);

obrigado pelo apoio!

Abraço!