OpenJPA: come costruire una query GROUP BY con un conteggio di gruppo
Domanda
In JPQL voglio costruire la query equivalente a questo:
select *, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
dove fingerprint
è un campo varchar nella tabella page_delta_summary
. Quello che ho è questa:
select d, count(d) as finger_count from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint"
dove PageDeltaSummary
è il mio soggetto. Ma sto ottenendo la seguente eccezione:
org.apache.openjpa.persistence.ArgumentException: Domande del tipo "classe com.su3analytics.sitedelta.model.PageDeltaSummary" con filtro "selezionare d, count (d) da PageDeltaSummary d dove d.deltaHistoryId =: deltaHistoryId e d.type =: pageDeltaType GROUP BY d.fingerprint" non è valido. I tuoi clausole di selezionare e avendo devono includere solo aggregati o valori che appaiono anche nel vostro clausola di raggruppamento.
La query funziona bene se rimuovere o count (d) come finger_count o GROUP BY.
Qualche suggerimento?
Grazie
Soluzione
La vostra query originale SQL non ha senso, quindi, non è possibile convertire in in JPQL.
Credo che si desidera ottenere conteggio delle righe page_delta_summary
che soddisfano le condizioni where
per ogni fingerprint
. Se è così, gli sguardi di query SQL come questo:
select fingerprint, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
e JPQL - in questo modo:
select d.fingerprint, count(d) from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint
Queste query restituiscono coppie <fingerprint
, finger_count
> al posto di righe page_delta_summary
completi (o enti).