Pregunta

Yo soy relativamente nuevo en la APP y me gustaría resolver el siguiente problema utilizando JPQL exclusivamente (nota que la aplicación que estoy utilizando es DataNucleus): Tengo una tabla de entidades versionados, y me gustaría obtener la última versión para todas las entidades en la tabla (es decir, que tengo una clase de entidad que tiene un id (que identifica de forma única una fila, una entityId (que identifica la propia entidad a lo largo de las versiones) y una marca de tiempo; me gustaría obtener la última versión entidad para todos entityId) Mi código actual es la siguiente:.

    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;

Cuando getEntity obtiene los datos de entidad para el entityId especificada, fecha y hora. He encontrado varios recursos sobre cómo este código 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 llegar a crear una versión JPQL de ella. Ayuda será muy apreciada, gracias.

¿Fue útil?

Solución

Si timestamps son únicos por entityId, 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top