2011-05-24 10 views
8

Necesito consultar para encontrar un registro con la fecha más reciente de un grupo de registros. He intentado un montón de cosas, con el más reciente es algo como esto:JPQL Consulta utilizando max en un campo de fecha

 
select msg, msg.createdDate from ImportedMessage msg where msg.siteId = ?1 and msg.createdDate = max(msg.createdDate) group by msg.createdDate 

Por desgracia, todo lo que he probado ha producido algún tipo de error. El error que parecen llegar más es:

 
Caused by: java.sql.SQLException: Not in aggregate function or group by clause: 
[email protected] in statement [select importedme0_.IMPORTED_MSG_ID as 
col_0_0_, importedme0_.CREATED_DATE as col_1_0_, max(importedme0_.CREATED_DATE) as 
col_2_0_, importedme0_.IMPORTED_MSG_ID as IMPORTED1_1_, importedme0_.CREATED_BY as 
CREATED2_1_, importedme0_.CREATED_DATE as CREATED3_1_, importedme0_.UPDATED_BY as 
UPDATED4_1_, importedme0_.UPDATED_DATE as UPDATED5_1_, importedme0_.IMPORT_TYPE as 
IMPORT6_1_, importedme0_.MESSAGE as MESSAGE1_, importedme0_.PROCESSED_FLAG as 
PROCESSED8_1_, importedme0_.SITE_ID as SITE9_1_ from IMPORTED_MSG importedme0_ where 
importedme0_.SITE_ID=? and importedme0_.CREATED_DATE=max(importedme0_.CREATED_DATE) 
group by importedme0_.CREATED_DATE] 
    at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.(Unknown Source) 
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1616) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:717) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) 
    at org.hibernate.loader.Loader.doList(Loader.java:2449) 
    ... 52 more 

Creo que lo que esto me está diciendo es que no tengo las cosas apropiadas en mi cláusula select para permitir que el grupo de trabajo. Sin embargo, he intentado todo tipo de combinaciones, y todo conduce a este error.

¿Puede alguien darme una pista de lo que estoy haciendo mal aquí?

Respuesta

9

Bueno, creo que el moderador no se molestó en leer la edición que se trasladó hasta la respuesta: comentario de interrogador en la intención de consulta:

"Tengo una tabla que conains una lista de elementos de datos (id ., mensaje (cadena), SiteID (cadena), CreatedDate (Marca de tiempo) lo que usted debe hacer es seleccionar la SiteID, luego encontrar el registro en ese grupo con el más reciente CreatedDate "

Solución:.

Query query = entityManagerReference.createQuery(
"SELECT msg FROM ImportedMessage msg " 
+ "WHERE msg.siteId = :siteId ORDER BY msg.createDate desc"); 

query.setParameter("siteId", 12345); 
query.setMaxResults(1); 
+1

¿Cómo funciona realmente el setMaxResults (1) en J? ¿PENSILVANIA? ¿Está ordenando a la base de datos que devuelva solo una fila, u obtenga todas las filas de la base de datos de acuerdo con la consulta, y luego devuelva solo una fila? – Wudong

+1

cómo funciona exactamente setMaxResults (1) depende de la implementación de JPA y las capacidades del controlador jdbc. En OpenJPA en MS-SQL esto se traduce en SELECCIONAR TOP 1 en la consulta SQL subyacente. – Armand

Cuestiones relacionadas