OpenJPA: cómo construir una consulta GROUP BY con un recuento de grupo
Pregunta
En JPQL Quiero construir la consulta equivalente a esto:
select *, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
donde fingerprint
es un campo varchar en page_delta_summary
mesa. Lo que tengo es la siguiente:
select d, count(d) as finger_count from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint"
donde PageDeltaSummary
es mi entidad. Pero me estoy haciendo la siguiente excepción:
org.apache.openjpa.persistence.ArgumentException: Su consulta del tipo "com.su3analytics.sitedelta.model.PageDeltaSummary clase" con filtro "seleccione d, count (d) de PageDeltaSummary d = donde d.deltaHistoryId: deltaHistoryId y d.type =: pageDeltaType GROUP BY d.fingerprint" no es válido. Sus cláusulas SELECT y que tienen solamente deben incluir agregados o valores que también aparecen en la cláusula de agrupación.
La consulta funciona bien si se quita o bien recuento (d) como finger_count o GROUP BY.
¿Alguna sugerencia?
Gracias
Solución
Su consulta SQL original, no tiene sentido, por lo tanto, no se puede convertir en en JPQL.
supongo que desea obtener el recuento de filas que satisfacen las condiciones page_delta_summary
where
para cada fingerprint
. Si es así, las miradas de consulta SQL como la siguiente:
select fingerprint, count(*) as finger_count from page_delta_summary
where delta_history_id = ? and change_type = ? group by fingerprint;
y JPQL - como esto:
select d.fingerprint, count(d) from PageDeltaSummary d
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType
GROUP BY d.fingerprint
Estas consultas devuelven pares <fingerprint
, finger_count
> en lugar de filas page_delta_summary
completos (o entidades).