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

COMO USAR O AVG COM JPQL

Meu metodo:

public BigDecimal buscaMediaVlTotal() {
        String query = "select AVG(c.vl_total) from Cliente c where c.vl_total >= 300 and c.id_customer between 15 and 200 ";
        return (BigDecimal) em.createQuery(query).getSingleResult();
    }

ta dando essa exception:

mai 04, 2017 1:59:34 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.math.BigDecimal
    at br.com.testeback2017.dao.ClienteDao.buscaMediaVlTotal(ClienteDao.java:25)
    at br.com.testeback2017.main.Insere.main(Insere.java:52)

como corrigir esse problema ?

3 respostas
solução!

Oi Julio, tudo bem ?

Por padrão a resposta é usando avg é do tipo Double, o que você precisa fazer é converter isso para BigDecimal :

public BigDecimal buscaMediaVlTotal() {
        String query = "select AVG(c.vl_total) from Cliente c where c.vl_total >= 300 and c.id_customer between 15 and 200 ";
        return new BigDecimal(em.createQuery(query).getSingleResult());
    }

Espero ter ajudado.

Abraços

Julio,

Me parece que a sua query está lhe devolvendo um double e você está tentando fazer um cast para BigDecimal, o que não rola... O que você pode tentar fazer é construir um BigDecimal a partir do double, assim:

public BigDecimal buscaMediaVlTotal() {
    String query = ...;
    return new BigDecimal(em.createQuery(query).getSingleResult());
}

Você pode tentar e depois dar um feedback aqui, se deu certo, ou não? =)

Espero ter ajudado,

Fábio

O problema é que você tem de converter seu double (que retorna da consulta) num BigDecimal. O cast só pode ser usado para classes que herdam de uma mesma superclasse (que acredito não ser o caso mas não cheguei a pesquisar.

Enfim, troca:

return (BigDecimal) em.createQuery(query).getSingleResult();

Por:

BigDecimal b = new BigDecimal(c);

return new BigDecimal(em.createQuery(query).getSingleResult());

Creio que isso resolva.