12.7.6. Recherches


12.7.6.1. Suppression de l'information d'auditing

Résumé

Hibernate Envers fournit une fonctionnalité qui permet d'extraire des informations d'audit par des requêtes. Cette section vous donne des exemples de telles requêtes.

Note

Les requêtes sur données auditées seront, dans la plupart des cas, bien plus lentes que les requêtes correspondantes sur données live, car elles impliquent des sous-sélections en corrélation.

Exemple 12.33. Chercher des entités d'une classe pour une révision donnée

Le point d'entrée de ce type de recherche est :
AuditQuery query = getAuditReader()
    .createQuery()
    .forEntitiesAtRevision(MyEntity.class, revisionNumber);
Des contraintes peuvent alors être spécifiées, par la classe de fabrique AuditEntity. La recherche ci-dessous ne sélectionne que des entités dont la propriété nom est égale à John:
query.add(AuditEntity.property("name").eq("John"));
Les demandes ci-dessous ne sélectionnent que des entités liées à une entité donnée :
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
Les résultats peuvent alors être classés, limités, et avoir des agrégations ou des projections (sauf en groupings) définis. L'exemple ci-dessous correspond à une recherche complète.
List personsAtAddress = getAuditReader().createQuery()
    .forEntitiesAtRevision(Person.class, 12)
    .addOrder(AuditEntity.property("surname").desc())
    .add(AuditEntity.relatedId("address").eq(addressId))
    .setFirstResult(4)
    .setMaxResults(2)
    .getResultList();

Exemple 12.34. Chercher les révisions de demandes pour lesquelles les entités d'une classe donnée ont changé

Le point d'entrée de ce type de recherche est :
AuditQuery query = getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true);
Des contraintes peuvent être ajoutées à cette recherche de la même façon que dans l'exemple précédent. Il y a d'autres possibilités pour cette recherche :
AuditEntity.revisionNumber()
Spécifie les contraintes, les projections et l'ordre en considération desquels l'entité auditée a été modifiée dans le numéro de révision.
AuditEntity.revisionProperty(propertyName)
Spécifier les contraintes, les projections et l'ordre de l'entité de révision sur une propriété , correspondants à la révision dans laquelle l'entité auditée a été modifiée.
AuditEntity.revisionType()
Fournit des accès au type de révision (ADD, MOD, DEL).
Les résultats de la recherche peuvent alors être ajustées selon les besoins. La recherche ci-dessous sélectionne le plus petit nombre de révision au cours desquelles l'entité de la classe de MyEntity, ayant pour ID entityId a changé, après le numéro de révision 42 :
Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.id().eq(entityId))
    .add(AuditEntity.revisionNumber().gt(42))
    .getSingleResult();
Les demandes de révision peuvent aussi minimiser/maximiser une propriété. La recherche ci-dessous sélectionne la révision au cours de laquelle la valeur de actualDate d'une entité donnée est supérieure à une valeur donnée, mais aussi petite que possible :
Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    // We are only interested in the first revision
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.property("actualDate").minimize()
        .add(AuditEntity.property("actualDate").ge(givenDate))
        .add(AuditEntity.id().eq(givenEntityId)))
    .getSingleResult();
Les méthodes minimize() et maximize() renvoient un critère, auquel des contraintes peuvent être ajoutées, et qui doit être respecté par les entités avec des propriétés maximisées/minimisées.
Il y a deux paramètres booléens qui ont été passés quand on crée une recherche
selectEntitiesOnly
Ce paramètre n'est valide que lorsqu'une projection explicite n'est pas définie.
Si true, le résultat de la recherche correspondra à une liste d'entités qui ont changé lors de révisions satisfaisant les contraintes spécifiées.
Si false, le résultat correspondra à une liste de trois tableaux d'éléments. Le premier élément correspondra à l'instance d'entité modifiée. Le second correspondra à une entité qui contient les données de révision. Si aucune entité personnalisée n'est utilisée, alors on aura une instance de DefaultRevisionEntity. Le troisième tableau d'éléments correspondra au type de révision (ADD, MOD, DEL).
selectDeletedEntities
Ce paramètre indique si les révisions dans lesquelles les entités ont été supprimées doivent être incluses dans les résultats. Si true, les entités auront le type de révision DEL, et tous les champs, à part l'id, auront pour valeur null.

Exemple 12.35. Chercher les révisions d'une entité qui ont pu modifier une propriété donnée

La recherche ci-dessous renverra toutes les révisions de MyEntity pour une id donnée, quand la propriété actualDate a été modifiée.
AuditQuery query = getAuditReader().createQuery()
  .forRevisionsOfEntity(MyEntity.class, false, true)
  .add(AuditEntity.id().eq(id));
  .add(AuditEntity.property("actualDate").hasChanged())
La condition hasChanged peut être combinée à des critères supplémentaires. La recherche ci-dessous renvoie une coupe horizontale de MyEntity au moment où le revisionNumber est créé. Ce sera limité aux révisions qui ont modifié prop1, et non pas prop2.
AuditQuery query = getAuditReader().createQuery()
  .forEntitiesAtRevision(MyEntity.class, revisionNumber)
  .add(AuditEntity.property("prop1").hasChanged())
  .add(AuditEntity.property("prop2").hasNotChanged());
Le jeu de résultats contiendra également des révisions avec des nombres inférieurs au revisionNumber. Cela signifie que cette recherche ne peut être interprétée comme « Renvoyer toutes les MyEntities modifiées dans le revisionNumber avec prop1 modifié et prop2 intact. »
Le recherche ci-dessous montre comment ce résultat peut être retourné, par l'intermédiaire de la recherche forEntitiesModifiedAtRevision  :
AuditQuery query = getAuditReader().createQuery()
  .forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
  .add(AuditEntity.property("prop1").hasChanged())
  .add(AuditEntity.property("prop2").hasNotChanged());

Exemple 12.36. Recherche d'entités modifiées dans une révision donnée

L'exemple ci-dessous montre la recherche de base d'entités modifiées pour une révision donnée. Cela permet aux noms d'entités et à leurs classes Java correspondantes d'être modifiées dans une révision spéciale que l'on souhaite extraire :
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
    .getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
Il y a un certain nombre de recherches accessibles de org.hibernate.envers.CrossTypeRevisionChangesReader:
List<Object> findEntities(Number)
Retourne des instantanés de toutes les entités d'auditing changées (ajoutées, mises à jour et supprimées) dans une révision donnée. Exécute des requêtes SQL n + 1, où n est un nombre de classes d'entités différentes modifiées dans la révision spécifiée.
List<Object> findEntities(Number, RevisionType)
Retourne des instantanés de toutes les entités d'auditing changées (ajoutées, mises à jour et supprimées) dans une révision donnée filtrée par type de modification. Exécute des requêtes SQL n + 1, où n est un nombre de classes d'entités différentes modifiées dans la révision spécifiée.
Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)
Retourne une carte contenant les listes des instantanés d'entité regroupés par opération de modification (ajout, mise à jour et suppression). Exécute des requêtes SQL 3n + 1, où n est un nombre de classes d'entités différentes modifiées au cours de la révision spécifiée.
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.