2
respostas

Duvida com BigDecimal e JPA

Boa tarde Pessoal!

To tentando fazer uma soma com jpql porem esta com o seguinte erro

ava.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [br.com.inteligenteweb.grade.relatorio.Margem]. Expected arguments are: java.math.BigDecimal, java.math.BigDecimal [select new br.com.inteligenteweb.grade.relatorio.Margem(p.valor, sum(p.valor) as total) from br.com.inteligenteweb.grade.model.Produto p group by p.fornecedor.id]

no qual esta esperando um bigDecimal, minha class mergem esta assim

package br.com.inteligenteweb.grade.relatorio;

import java.math.BigDecimal;



public class Margem {

    private BigDecimal valor;
    private BigDecimal total;


    public Margem(BigDecimal valor, BigDecimal valorVenda, BigDecimal total){
        this.valor = valor;
        this.total = total;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }    

}

e meu DAO

@SuppressWarnings("unchecked")
    public List<Margem> margem() {
        Query query = em.createQuery("select new "
                + Margem.class.getName()
                + "(p.valor, sum(p.valor) as total) "
                + "from Produto p group by p.fornecedor.id");
        return query.getResultList();

    }

O que fa'co para resolver?

2 respostas

Fala ai Rafael, tudo bem ?

A JPA precisa de um construtor sem parametros para conseguir funcionar, ela não consegue montar o objeto baseado no construtor.

Olá, além do construtor sem parâmetros que o JPA precisa, o construtor que você está passando está incorreto.

Perceba que seu construtor possui 3 parâmetros.

  public Margem(BigDecimal valor, BigDecimal valorVenda, BigDecimal total){
    }

No entanto no seu SQL você está passando somente 2 parâmetros, sendo assim o hibernate não encontra nenhum construtor com somente 2 parâmetros.

"select new "
                + Margem.class.getName()
                + "(p.valor, sum(p.valor) as total)

Crie um construtor com 2 parâmetros ou adeque o SQL para que receba os 3 parâmetros, ('valor', 'valorVenda', Total).