OpenJpa: Como construir um grupo por consulta com uma contagem de grupo
Pergunta
Em JPQL, quero construir a consulta equivalente a isso:
select *, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
Onde fingerprint
é um campo Varchar na tabela page_delta_summary
. O que eu tenho é isso:
select d, count(d) as finger_count from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint"
Onde PageDeltaSummary
é minha entidade. Mas estou recebendo a seguinte exceção:
org.apache.openjpa.persistence.argumentException: Sua consulta na classe "classe com.su3analytics.sitedelta.model.pagedeltaSummary" com filtro "selecione d, contagem (d) de PagedeltaMmary d onde d.deltahistoryid =: deLtaHistory e D. =: Grupo PagedELTAType por D.Fingerprint "é inválido. Sua seleção e as cláusulas devem incluir apenas agregados ou valores que também aparecem na sua cláusula de agrupamento.
A consulta funciona bem se eu remover a contagem (d) como dedo_count ou o grupo por.
Alguma sugestão?
Obrigado
Solução
Sua consulta SQL original não faz sentido; portanto, você não pode se converter em JPQL.
Eu acho que você quer ter conta de page_delta_summary
linhas satisfatórias where
condições para cada um fingerprint
. Nesse caso, a consulta SQL se parece com a seguinte:
select fingerprint, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
e JPQL - assim:
select d.fingerprint, count(d) from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint
Essas consultas retornam paresfingerprint
, finger_count
> em vez de cheio page_delta_summary
linhas (ou entidades).