9
votes

Liste la dernière révision de chaque entité avec Envers

J'essaie de récupérer la dernière révision des entités toutes fortes>, qui n'ont pas été supprimées. Faire cela dans SQL est très simple avec un sous-sélection:

public List<Object[]> findLatestArticleRevisions(){
    List<Object[]> results = (List<Object[]>) getJpaTemplate().execute(new AuditReaderCallback() {
        @Override
        public Object doInAuditReader(AuditReader auditReader) {
            return auditReader.createQuery().forRevisionsOfEntity(Article.class, false, false)
                // TODO select distinct on entities
                .addOrder(new PropertyAuditOrder(new RevisionNumberPropertyName(), false))
                .getResultList();
        }
    });

    return results;
}


0 commentaires

4 Réponses :


0
votes

Cela fonctionnera: xxx

}

et ensuite xxx

}


1 commentaires

Merci de votre réponse - mais j'aimerais trouver la dernière révision pour toutes les entités et non pour une spécifique. Je n'ai pas d'identifiant pour interroger



0
votes

Essayez d'ajouter une propriété maximisée:

[your query].add(AuditEntity.revisionNumber().maximize())


3 commentaires

Cela ne me donnera que la révision de la plupart des entités modifiées. Je dois avoir la dernière révision de chaque entité de sortie


Hmm as-tu essayé? Je pense que cela devrait générer une requête avec une sous-requête max () comme dans la question.


Oui j'ai essayé. Et oui, il génère une sous-requête avec max (), mais la sous-requête n'est pas évaluée par carte d'identité, de sorte que la requête résultante ressemble à ce Sélectionnez * à partir de l'article_aud Aud1 où REV IN (SELECT) de l'article_aud Aud2) < / code> La comparaison par ID est manquante



9
votes

Nous devons utiliser la solution de https://hibernate.atlassian.net/browse/hhh- 7827 Ie auditityty.RevisionNumber (). Maximize (). ComputeraggregationInstanContextextextextextextex () /Stackoverflow.com/questions/25723323/find-max-Revision-Of-Entity-less-less-than-or-equion-a-given-revision-with-enver">Find Max révision de chaque entité inférieure ou égale à la révision donnée avec des envois

peut hiberner Envoi de retourner la dernière révision de toutes les entités d'un type spécifique?


3 commentaires

Y a-t-il un moyen d'obtenir le dernier numéro de révision d'une entité? Dis comme une entité a été insérée, mise à jour deux fois et il a maintenant 3 numéros de révision. Comment puis-je obtenir le dernier numéro de révision?


HMM Cela semble fonctionner lorsque j'ai plusieurs révisions retournées dans la requête, la fonction globale me donne la dernière révision (la plus élevée). Mais s'il n'y a qu'une seule révision, il ne renvoie aucune révision du tout. Avez-vous eu cette question?


En fait, je pense mal compris comment cela fonctionnait. Si vous filtrez la dernière révision d'une entité, cette entité n'est pas retournée. Je voulais la dernière version de l'entité après avoir filtré les révisions. C'est à dire. Donnez-moi toutes les révisions avant mercredi et donnez-moi la dernière version de l'entité de ce sous-ensemble. Ne semble pas fonctionner de cette façon.



0
votes

La réponse de @Charybr travaille, si vous mettez la parathess la bonne façon. Ajoutez simplement vos filtres dont vous avez besoin pour le sous-ensemble que vous souhaitez sélectionner directement à la section Maximize Requête. De cette manière, les déclarations de sélection apparaîtront également dans la sous-requête.

    AuditQuery query = auditReader.createQuery()
            .forRevisionsOfEntity(Event.class, true, true);

    query.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize());
    query.setMaxResults(pageable.getPageSize());
    query.add(
                AuditEntity.revisionNumber().maximize()
                .computeAggregationInInstanceContext()
                    .add(AuditEntity.property("critical").eq(true))
             );
    query.getResultList();


0 commentaires