Hibernar HQL y recuperar con agrupación

Tenemos un pojo de hibernación Reporting / ReportingID que tiene varias propiedades que contienen recuentos, fechas, acciones y dispositivos. La propiedad del dispositivo asignada a un pojo de hibernación llamado Dispositivo (nota: quiero que recupere el dispositivo para no tener que consultarlo por separado).

Entonces, lo que tengo es un HQL que se ve así:

"SELECT sum(report.deviceTotal), sum(report.settledPricePerDownloadExpense), report.id.device, avg(report.settledPricePerDownloadExpense), report.id.dCampaignActionTypeId " +
"FROM Reporting report " +
"WHERE report.id.dCampaignReportDate between :startDate and :endDate " +
"AND report.id.dCampaignActionTypeId in (:actionIds) " +
"AND report.id.dCampaign.dCampaignId in (:campaigns) " +
"GROUP by report.id.dCampaignActionTypeId, report.id.device " +
"ORDER by 1";

Pensé que eso funcionaría, pero me sale este error:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Column 'dbo.device.device_id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)

Lo que obtengo de esto es que tengo que enumerar todas las columnas de la tabla de dispositivos en la cláusula group by que parece una locura

preguntado el 16 de mayo de 11 a las 18:05

1 Respuestas

Escribir

group by something

en HQL donde something es una entidad que se traduce en

group by entity_id1, entity_id2 ...

en SQL donde entity_id1, entity_id2, etc.son columnas en las que la entidad id las propiedades están mapeadas. En caso de un identificador simple (en lugar de compuesto / componente), solo habría una sola columna.

Esto funciona bien para consultas regulares y presenta problemas obvios para selecciones de "búsqueda de unión". No hay soluciones alternativas: deberá enumerar explícitamente todas las propiedades individualmente en agrupar por.

El otro enfoque (que puede o no ser adecuado, imposible de decir sin saber mucho más sobre su modelo) es evitar el uso de búsqueda de combinación y, en su lugar, almacenar en caché sus entidades (a través de la caché de sesión y / o de segundo nivel) recuperando así (y agrupando por) solo id de entidad.

contestado el 17 de mayo de 11 a las 04:05

Hice que esto funcionara básicamente usando criterios en lugar de HQL, pero el equipo quiere que todos usen HQL. Creo que me ceñiré a los criterios y los dejaré gemir y gemir. - Arinte

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.