当前位置: 首页 > 知识库问答 >
问题:

Hibernate Envers:如何获取所有当前 enties 及其创建时间戳

孟永望
2023-03-14

我使用Hibernate Envers审计名为Client的实体的更改。现在,我想从持久层读取所有当前(未删除)的客户机实体,包括它们的创建时间戳。Hibernate Envers将所有必要的信息html" target="_blank">存储在审核表中。对我来说,不清楚如何执行所需的查询。我尝试了以下方法:

//Get last Revision Number for Entity Client
private Number getLastRev() {
    AuditReader auditReader = AuditReaderFactory.get(getEm());
    AuditQuery query = auditReader.createQuery()
            .forRevisionsOfEntity(Client.class, true, true)
            .addProjection(AuditEntity.revisionNumber().max());
    Number n = (Number) query.getSingleResult();
    return n;
}
public List<Object[]> getAllClientsWithCreationTimestamp() {
    Number revision = getLastRev();
    AuditReader auditReader = AuditReaderFactory.get(getEm());
    AuditQuery query = auditReader.createQuery()
            .forEntitiesAtRevision(Client.class, revision)
            .addProjection(AuditEntity.property("id"))
            .addProjection(AuditEntity.property("firstName"))
            .addProjection(AuditEntity.property("lastName"))
            .addProjection(AuditEntity.property("email"))                
            .addProjection(AuditEntity.revisionProperty("timestamp"))
            .addOrder(AuditEntity.revisionProperty("timestamp").desc());
}

不幸的是,getAllClientsWithCreationTimestamp()列出了时间戳为“last modification”而不是“creation”的所有当前实体。

我希望任何人都可以帮助我创建正确的查询。

我的实体的java代码如下所示:

@Entity
@Table(name = "CLIENT")
@Audited
public class Client implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CLIENT_SEQ")
@SequenceGenerator(name="CLIENT_SEQ", sequenceName="CLIENT_SEQ", allocationSize=1)
private Long Id;

@Column(name = "FIRST_NAME", length = 100)
private String firstName;

@Column(name = "LAST_NAME", nullable = false, length = 100)
private String lastName;

@Column(name = "EMAIL", nullable = false)
private String email;

public Long getId() {
    return Id;
}

public void setId(Long id) {
    Id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}
}

我有以下数据库表:

  • 修订版本: Envers 主修订版本实体表
  • 客户端:用于存储客户端实体的表
  • CLIENT_AUD:用于存储客户端修订的表

数据库表

共有1个答案

丌官昊天
2023-03-14

你的代码很接近,但我相信你有一些错误。

为了获得创建时间戳,您需要为该用例使用不同的查询,并将它与您的其他查询结合起来。以下查询将返回一个投影,其中包含创建审计行时的实体id和时间戳。您只需要用它创建一个id/时间戳对的映射。

AuditQuery query = auditReader.createQuery()
  .forRevisionsOfEntity( Client.class, true, false )
  .addProjection( AuditEntity.id() )
  .addProjection( AuditEntity.revisionProperty( "timestamp" ) )
  .add( AuditEntity.revisionType().eq( RevisionType.ADD ) );

接下来,您需要获取每个实体 ID 的最新修订版号,然后再次将结果转换为 ID/修订版号对的映射。

AuditQuery query = auditReader.createQuery()
  .forRevisionsOfEntity( Client.class, true, false )
  .addProjection( AuditEntity.id() )
  .addProjection( AuditEntity.revisionNumber().max() );

现在,只需要求 Envers 根据最大修订号将您的数据投影查询还给您,并将其与上面的 id/时间戳映射相结合即可。

for ( Map.Entry<YourEntityIdType,Number> entry : idRevisionPairs.entrySet() ) {
  AuditQuery query = auditReader.createQuery()
    .forEntitiesAtRevision( Client.class, entry.getValue() )
    .add( AuditEntity.id().eq( entry.getKey() )
    .addProjection( ... );

  // here take the results from query and the id-timestamp pairs and
  // marry them into some DTO you return.
}
 类似资料:
  • 但是响应只返回用户和他们的一些属性,而不是我在门户中看到的所有属性。 进行REST调用以获取所有用户及其字段/属性的正确URI是什么?

  • 问题内容: 请考虑以下代码段: 哪里是我追求的是将包含字典,并且,除其他事项外。 我希望基本上能够引用字符串中当前作用域内的所有变量。因此,预期输出为: 我可以通过传递给实现。这是否总是正确的,或者在某些极端情况下此表达式将无法正确处理? 重写以澄清问题。 问题答案: 在执行操作时合并两个字典的最佳方法是(将本地变量覆盖全局变量)。 缺少将全局变量和本地变量合并的方法是(a)内置函数(我想这是故意

  • 本文向大家介绍PostgreSQL 如何获取当前日期时间及注意事项,包括了PostgreSQL 如何获取当前日期时间及注意事项的使用技巧和注意事项,需要的朋友参考一下 在开发数据库应用或者调试代码时,经常需要获取系统的当前日期和时间,我们来看一下 PostgreSQL 中提供的相关函数。 当前日期 CURRENT_DATE CURRENT_DATE 函数用于获取数据库服务器的当前日期: 调用该函数

  • 问题内容: 如何使用Java获取当前日期和时间? 我正在寻找与C#等效的东西。 问题答案: 只需构造一个没有任何参数的新对象即可;这会将当前日期和时间分配给新对象。 在的话的Javadoc的无参数的构造函数: 分配一个Date对象并对其进行 初始化,以便它表示分配它的时间( 以最近的毫秒为单位)。 确保您使用的不是-后者没有零参数构造函数,并且语义有所不同,这是完全不同的对话的主题。:)

  • 问题内容: 获取当前时间的模块/方法是什么? 问题答案: 采用: 而只是时间: 有关更多信息,请参见文档。 要保存输入,可以datetime从datetime模块中导入对象: 然后datetime.从以上所有位置移除引线。

  • 问题内容: 我想获取UTC的当前时间。我到目前为止所做的是(仅出于测试目的): 是我的当地时间,那很好 是我的本地时间+ 1,但应该是本地时间-1 … 我的本地时区是UTC + 1(根据调试输出和此处的列表:https : //www.joda.org/joda- time/timezones.html )… 如何正确地从一个时区转换为另一个时区(包括毫秒表示)? 编辑 我需要日期/毫秒…这不是正