OpenJPA: comment construire un GROUP BY requête avec un compte de groupe
Question
Dans JPQL Je veux construire la requête équivalente à ceci:
select *, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
où fingerprint
est un champ varchar dans le tableau page_delta_summary
. Ce que j'est le suivant:
select d, count(d) as finger_count from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint"
où PageDeltaSummary
est mon entité. Mais je reçois l'exception suivante:
org.apache.openjpa.persistence.ArgumentException: Votre requête du type "com.su3analytics.sitedelta.model.PageDeltaSummary de classe" avec filtre « select d, le nombre (d) de PageDeltaSummary d où d.deltaHistoryId =: deltaHistoryId et d.type =: pageDeltaType GROUP BY d.fingerprint » est invalide. Votre sélection et ayant des clauses doivent inclure uniquement les agrégats ou les valeurs qui apparaissent également dans votre clause de regroupement.
La requête fonctionne bien si je retire soit le nombre (d) en tant que finger_count ou le GROUP BY.
Toutes les suggestions?
Merci
La solution
Votre requête SQL d'origine n'a pas de sens, vous ne pouvez donc convertir en en JPQL.
Je suppose que vous voulez obtenir le nombre de lignes de page_delta_summary
satisfaisant les conditions de where
pour chaque fingerprint
. Si oui, l'aspect de la requête SQL comme ceci:
select fingerprint, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
et JPQL - comme ceci:
select d.fingerprint, count(d) from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint
Ces requêtes renvoient paires <fingerprint
, finger_count
> au lieu de lignes complètes de page_delta_summary
(ou entités).