Hibernate Audit表及其查询

本文介绍了Audit表的用途及如何记录数据变动的历史,并详细解释了Hibernate提供的AuditQuery接口进行审计查询的方法及其限制。此外还提供了复杂的查询示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • Audit表


    Audit表是用来记录数据创建,修改,删除的历史记录表。

    一条数据可能经历创建,修改,删除,每当这条数据经历其中的一个动作就会在相应的audit表中有一条记

录。

 

     从表中的id可以看到,这个audit表只记录了两条数据的变动历史。id是对应于原来数据的id,的rev代表的是修改的版本号,revtype为0代表创建,1代表修改,2代表删除。删除后的数据相对应的audit表只有id,rev,revtype 这三个字段有值,其他字段的值会为空,因为这条数据已经删除。

  • 查询

    hibernate提供的AuditQuery这个接口来查询audit表,但是其查询能力有限,只能做一些简单的查询, 不能关联表做查询。未来的版本这个限制可能会得到改进。 

    如果要做复杂查询,建议直接使用sql通过spring提供的JdbcTemplate查询。

AuditQuery c =  getAuditReader().
                    createQuery().
                    forRevisionsOfEntity(clazz , false, true);
    c.add(AuditEntity.id().eq(page.getSf_EQ_id()));
    c.add(AuditEntity.property("active").eq(true));
    c.add(AuditEntity.revisionNumber().
    eq(getRevisionNumber(id, clazz, Boolean.TRUE)));
    c.add(AuditEntity.relatedId("groupType").eq(parentId));
    c.add(AuditEntity.property("corporation").eq(corporation));  
 
    protected AuditReader getAuditReader() {
        return AuditReaderFactory.get(getSession());
    }  
    c.setFirstResult(0)
    c.setMaxResults(10); 
    c.getResultList()



add (AuditCriterion criterion)是AuditQuery最重要的方法,用来添加限制条件。

AuditEntity这个接口是用来创建限制条件的。

    当要创建的查询条件,关乎的属性是一个对象,但在这个查询类不能使用这个对象的类时(一般audit查询的DAO都在父工程中,父工程的类不能使用工程的类),就可以用relatedId(String propertyName)这个方法。

  • 返回

AuditQuery c = getAuditReader().createQuery().forRevisionsOfEntity(clazz , false, true);
public AuditQuery forRevisionsOfEntity(Class<?> c, boolean selectEntitiesOnly, boolean selectDeletedEntities)

当selectEntitiesOnly为true时,查询结果返回的list的每个元素是实体对象。
当selectEntitiesOnly为false时,查询结果返回的list的每个元素是一个数组。每个数组包含三个对象。数组的第一个对象是实体对象,第二个元素是revision data对象(默认是DefaultRevisionEntity类型的实例包含版本信息id, 修改时间信息datetime),第三个对象是revision type对象(枚举提供的信息是修改类型,ADD-添加,MOD-修改,DEL-删除)

                c.addProjection(AuditEntity.property("code"));
		c.addProjection(AuditEntity.property("name"));
		c.addProjection(AuditEntity.property("firstName"));

		c.add(AuditEntity.id().eq(page.getSf_EQ_id()));

		c.setFirstResult(page.getBeginIndex()); 
		c.setMaxResults(page.getPageSize());
		page.setObjResult(c.getResultList());



用addProjection()这个方法只返回某些特定的字段。这个查询将返回一个list,list中每个元素是一个数组,数组的第一个元素值是code,第二个是name,第三个是firstName。

转载于:https://my.oschina.net/u/1583086/blog/277550

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值