JPA JPQL: SELECT NEW com COUNT, GROUP BY e ORDER BY

Existem 2 tabelas / entidades: AppleTree e Apples . Uma macieira produz 0 … n maçãs. Cada maçã é uma entidade / linha da segunda tabela e faz referência à macieira que a produziu ( ManyToOne ).

Eu quero gerar um relatório de “pontuação alta” sobre as macieiras mais produtivas. Deve ser ordenado pela coluna COUNT em ordem decrescente:

 APPLE TREE | COUNT(A) --------------------- 10304 | 1000 72020 | 952 31167 | 800 

Para lidar com esses resultados, criei um bean não-entidade que combina um object AppleTree e um valor longo (para COUNT):

 // constructor public AppleStats (AppleTree at, long howManyApples) { ... } 

Eu quero buscar linhas deste tipo combinado usando JPQL. Minha abordagem é baseada na syntax SELECT NEW :

 SELECT NEW foo.bar.AppleStats ( a.appleTree, COUNT(a) AS c ) FROM Apples a GROUP BY a.appleTree ORDER BY c DESC 

Infelizmente, produz algumas mensagens de erro. Acho que um problema é o alias da coluna para o valor COUNT. Eu uso como eu quero classificar por este valor agregado. Isso significa que não há diferença se eu uso “COUNT (a) AS c” ou “COUNT (a) c”. Diz que os argumentos não foram separados por vírgula. Além disso, a “expressão é inválida, o que significa que não segue a gramática JPQL” . Finalmente, diz que não podem ser encontrados construtores que correspondam aos tipos de argumentos. “

Existe uma maneira de obter minhas linhas de resultado da AppleStats? Ou eu tenho que regredir para consultas nativas?

Tente esta consulta:

 SELECT NEW foo.bar.AppleStats(a.appleTree, COUNT(a.appleTree)) FROM Apples a GROUP BY a.appleTree ORDER BY COUNT(a.appleTree) DESC 

Infelizmente eu não tenho uma plataforma JPA para testá-lo agora, mas o acima deve corrigir os problemas de syntax da consulta original. E não se preocupe com o fato de que a function de agregação COUNT() aparece duas vezes, uma linguagem bem comum ao escrever consultas e qualquer otimizador decente deve ser capaz de lidar com isso e executar a operação apenas uma vez.

    Intereting Posts