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。

相關文章
相關標籤/搜索