从休眠审计历史中选择一个字段

Posted

技术标签:

【中文标题】从休眠审计历史中选择一个字段【英文标题】:Select One field from hibernate audit history 【发布时间】:2018-06-27 11:59:08 【问题描述】:

我只想从休眠审计中获取一个字段(实体的 PK)。 下面的代码给了我整个实体而不是一个字段

AuditReader reader = AuditReaderFactory.get(entityManager);
List<Contact> contactList = reader.createQuery()
                            .forRevisionsOfEntity(Contact.class, true, true)
                            .add(AuditEntity.revisionProperty("timestamp").between(startDate, endDate))
                            .getResultList();

我也试过了,但它抛出空指针异常

AuditReader reader = AuditReaderFactory.get(entityManager);
List<Contact> contactList = reader.createQuery()
                            .forRevisionsOfEntity(Contact.class,"ID", true, true)
                            .add(AuditEntity.revisionProperty("timestamp").between(startDate, endDate))
                            .getResultList();

例外:

java.lang.NullPointerException
at org.hibernate.envers.query.criteria.CriteriaTools.checkPropertyNotARelation(CriteriaTools.java:41)
at org.hibernate.envers.query.criteria.BetweenAuditExpression.addToQuery(BetweenAuditExpression.java:48)
at org.hibernate.envers.query.impl.RevisionsOfEntityQuery.list(RevisionsOfEntityQuery.java:99)
at org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110)
at com.unifyv4.ejb.service.subscription.SubsService.getupdatedAccountDetail(SubsService.java:4249)

【问题讨论】:

想要获取 Contact.class 的字段,即 Contact.ID 【参考方案1】:

您可以通过为查询设置投影来查询不同的数据子集:

query.addProjection(AuditEntity.id);

当您这样做并调用 getResultList 时,结果列表将包含 ID 列表而不是实体列表。

【讨论】:

我想获取 Contact.class 的字段,即 Contact.ID

以上是关于从休眠审计历史中选择一个字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据库中保留修改的历史细节(审计跟踪)?

字段更改的休眠审计日志

JOOQ - 相当于用于填充历史字段的休眠拦截器?

使用更新事件进行休眠审计

休眠选择所有投影分组

需要建议以根据审计表重新创建表的历史记录