1
resposta

Duvidas no JPQL - Funções de Agregação e Group by

Consegui fazer a query por data, porem quando tento inserir outro criterio, ex: media por data / conta. Aí nao vai. Consigo fazer essas queries com 2 criterios distintos desta forma?

public class TestaAvgDasMovimentacoes {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("contas");
        EntityManager em = emf.createEntityManager();

        String jpql2 = "Select new br.com.rodev.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data), year(m.data), m.conta_id)"
                + " from Movimentacao m group by day(m.data), month(m.data), year(m.data), m.conta_id";

        TypedQuery<MediaComData> query2 = em.createQuery(jpql2, MediaComData.class);
        List<MediaComData> mediasComDatas = query2.getResultList();

        for (MediaComData mediaComData : mediasComDatas) {
            System.out.println("Media do dia " + mediaComData.getDia() + "/" + mediaComData.getMes() + "/" + mediaComData.getAno() + ": R$" + mediaComData.getMedia());
        }

Consegui fazer apenas dividindo em 2 queries, seria este o caso?

public class TestaSomaDasMovimentacoes {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("contas");
        EntityManager em = emf.createEntityManager();

        String jpql = "Select id from Conta";
        String jpql2 = "Select sum(m.valor) from Movimentacao m where conta_id = :pConta";
        TypedQuery<Long> query = em.createQuery(jpql, Long.class);
        TypedQuery<BigDecimal> query2 = em.createQuery(jpql2, BigDecimal.class);

        List<Long> contas = query.getResultList();
        for (Long conta : contas) {
            System.out.println(conta);
            query2.setParameter("pConta", conta);
            BigDecimal soma = query2.getSingleResult();
            System.out.println(soma);

        }

    }

}
1 resposta

Foi eu postar minha duvida que consegui resolver: Tinha colocado m.conta_id ilo m.conta.id, misturei o JPQL com a liguagem relacional. Só apanhando pra aprender mesmo.

public class TestaAvgDasMovimentacoes {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("contas");
        EntityManager em = emf.createEntityManager();

        String jpql2 = "Select new br.com.rodev.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data), year(m.data), m.conta.id)"
                + " from Movimentacao m group by m.conta.id, day(m.data), month(m.data), year(m.data)";

        TypedQuery<MediaComData> query2 = em.createQuery(jpql2, MediaComData.class);
        List<MediaComData> mediasComDatas = query2.getResultList();

        for (MediaComData mediaComData : mediasComDatas) {
            System.out.println("Conta: " + mediaComData.getConta() + " Media do dia " + mediaComData.getDia() + "/" + mediaComData.getMes() + "/" + mediaComData.getAno() + ": R$" + mediaComData.getMedia());
        }

    }

}