Hibernate Audit表及其查询


  • Audit表


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

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

录。 sql

 

     从表中的id能够看到,这个audit表只记录了两条数据的变更历史。id是对应于原来数据的id,的rev表明的是修改的版本号,revtype为0表明建立,1表明修改,2表明删除。删除后的数据相对应的audit表只有id,rev,revtype 这三个字段有值,其余字段的值会为空,由于这条数据已经删除。 数组

  • 查询

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

    若是要作复杂查询,建议直接使用sql经过spring提供的JdbcTemplate查询。 hibernate

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最重要的方法,用来添加限制条件。 code

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-删除)
get

                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。

相关文章
相关标签/搜索