2010-11-25 6 views
10

Je suis relativement nouveau à JPA et je voudrais résoudre le problème suivant en utilisant exclusivement jpql (notez que l'implémentation que j'utilise est Datanucleus): J'ai un tableau d'entités versionnées, et je voudrais obtenir la dernière version pour toutes les entités de la table (ie j'ai une classe d'entité qui a un identifiant (qui identifie uniquement une ligne, un entityId (qui identifie l'entité elle-même dans toutes les versions) et un horodatage; comme pour obtenir la dernière entité version pour tous entityID) Mon code actuel se présente comme suit:..Jpql sélectionnant la rangée maximum de chaque groupe

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; 

Où getEntity obtient les données d'entité pour l'entityID spécifiée, timestamp j'ai trouvé plusieurs ressources sur la façon dont ce c ode fonctionnerait en sql ici http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ mais je n'arrive pas à en créer une version jpql. L'aide sera grandement appréciée, merci.

Répondre

30

Si timestamp s sont uniques par entityId, vous pouvez écrire quelque chose comme ceci:

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

Non, je ne peux pas être sûr qu'ils sont uniques –

+0

@Rares: Je voulais dire 'entityId'. – axtavt

+0

EntityId n'est pas non plus unique. Il est utilisé pour identifier une entité indépendamment de sa version (ie 2 entrées avec des horodatages différents, mais la même entityId correspond à la même entité, donc je suis capable de basculer entre les versions de la même entité) –

Questions connexes