2010-11-25 12 views
10

Soy relativamente nuevo en JPA y me gustaría resolver el siguiente problema usando jpql exclusivamente (tenga en cuenta que la implementación que estoy usando es Datanucleus): Tengo una tabla de entidades versionadas, y me gustaría obtener la última versión para todas las entidades en la tabla (es decir, tengo una clase de entidad que tiene un id. (que identifica de forma única una fila, un entityId (que identifica a la entidad en todas las versiones) y una marca de tiempo; como para obtener la última versión entidad para todos entityId) Mi código actual es la siguiente:..Jpql seleccionando la fila máxima de cada grupo

String innerQueryString = "SELECT entity.entityId, max(entity.timestamp) " + 
        "FROM Entity entity" + 
        "GROUP BY entity.entityId"; 

    Query getQuery = getEntityManager().createQuery(innerQueryString); 

    List<Object[]> queryRes = getQuery.getResultList(); 
    List<IEntity> ret = new ArrayList<IEntity>(); 

    for (Object[] res : queryRes) { 
     ret.add(getEntity((Long)res[0], (Date)res[1])); 
    } 

    return ret; 

Dónde getEntity obtiene los datos de la entidad para la especificada entityId, fecha y hora que se han encontrado varios recursos sobre cómo este c ode funcionaría en sql aquí http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ pero no puedo crear una versión jpql. La ayuda será muy apreciada, gracias.

Respuesta

30

Si timestamp s son únicos por entityId, se puede escribir algo como esto:

SELECT e FROM Entity e 
WHERE e.timestamp = (SELECT MAX(ee.timestamp) FROM Entity ee WHERE ee.entityId = e.entityId) 
+0

No, no puedo estar seguro de que son únicos –

+0

@Rares: 'Me refería entityId'. – axtavt

+0

EntityId tampoco es único. Se usa para identificar una entidad independientemente de su versión (es decir, 2 entradas con diferentes marcas de tiempo, pero la misma entidad Id corresponde a la misma entidad, por lo tanto, puedo cambiar entre versiones de la misma entidad) –

Cuestiones relacionadas