2010-11-23 29 views
0

Dans JPQL Je veux construire la requête équivalente à ceci:OpenJPA: comment construire un GROUP BY requête avec un groupe compte

select *, count(*) as finger_count from page_delta_summary 
where delta_history_id = ? and change_type = ? group by fingerprint; 

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" 

PageDeltaSummary est mon entité. Mais je reçois l'exception suivante:

org.apache.openjpa.persistence.ArgumentException: Votre requête sur le type "class com.su3analytics.sitedelta.model.PageDeltaSummary" avec filtre "select d, count (d) from PageDeltaSummary d où d.deltaHistoryId =: deltaHistoryId et d.type =: pageDeltaType GROUP BY d.fingerprint "n'est pas valide. Vos clauses select et having ne doivent contenir que des agrégats ou des valeurs qui apparaissent également dans votre clause de regroupement.

La requête fonctionne correctement si je supprime count (d) en tant que finger_count ou GROUP BY.

Des suggestions?

Merci

Répondre

2

Votre requête SQL d'origine n'a pas de sens, donc vous ne pouvez pas convertir en en JPQL.

Je suppose que vous voulez obtenir le nombre de page_delta_summary lignes satisfaisant where conditions pour chaque fingerprint. Dans ce cas, la requête SQL ressemble à 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 plein page_delta_summary lignes (ou entités).

+0

merci pour la réponse. mais pourquoi mon sql original n'a-t-il pas de sens? Je peux l'exécuter directement sans problème. –

+0

@Richard: Je me demande quelle base de données le supporte. Typiquement, la clause SELECT ne peut utiliser que les mêmes champs que dans la clause GROUP BY ou des fonctions d'agrégation dans d'autres champs. – axtavt

+0

J'utilise MySQL, c'est tellement intéressant qu'il est supporté –