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。