Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

TypedQuery confuso...

Estou recebendo resultados diferentes do exercício dado em aula. Tenho a seguinte classe:

public class TesteFuncoesJPQL {
    public static void main(String[] args) {

        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        Conta conta = new Conta();
        conta.setId(2);

        String jpql = "select distinct avg(m.valor) from Movimentacao m where m.conta = :pConta" +
        " and m.tipo = :pTipo" +
        " group by m.data";

        TypedQuery<Double> query = em.createQuery(jpql, Double.class);
        query.setParameter("pConta", conta);
        query.setParameter("pTipo", TipoMovimentacao.SAIDA);

        List<Double> medias = query.getResultList();

        for (Double media : medias) {
            System.out.println("A média é " + media);
        }

        em.getTransaction().commit();
        em.close();        
    }
}

Que está exatamente igual à classe dada em aula. O meu banco de dados está com as datas diferentes das datas da aula, mas tenho somente duas datas. Os dados do banco estão assim:

id    data    descricao    tipo    valor    conta_id
1    2017-05-12 10:53:06    Viagem a SP    SAIDA    100.00    2
2    2017-05-12 10:53:06    Viagem ao RJ    SAIDA    300.00    2
3    2017-05-12 11:58:01    Viagem a SP    SAIDA    100.00    2
4    2017-05-13 11:58:02    Viagem ao RJ    SAIDA    300.00    2

Se tenho duas datas, acho que deveria ter duas linhas de média, mas estou recebendo três quando rodo esta classe:

A média é 200.0

A média é 100.0

A média é 300.0

Lendo agora os resultados me parece que o "group by" está considerando a hora no joint. Com fazer para o joint pegar apenas a data e não a hora? Acredito que esta seja a pergunta correta. rs

Muito grato.

1 resposta
solução!

Olá Gustavo,

Basta você utilizar as funções do banco de dados para extrair o ano, mês e dia da data de suas movimentações na hora de fazer o gourp by :

...
String jpql = "select distinct avg(m.valor) from Movimentacao m where m.conta = :pConta" +
        " and m.tipo = :pTipo" +
        " group by year(m.data), month(m.data), day(m.data)";
...

Espero ter ajudado!!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software