使用Envers查询历史数据

用Envers查询历史数据步骤:

1. 获取AuditReader对象并创建Query

AuditReader auditReader = AuditReaderFactory.get(sessionFactory.getCurrentSession());
//查询Account某个版本的历史数据,结果集为AccountImpl的List
AuditQuery query = auditReader.createQuery().forEntitiesAtRevision(AccountImpl.class, 2);
//查询Account的所有历史数据
//第二个参数selectEntitiesOnly(结果集是否包含版本信息):
//true 结果集为Object数组的List,Object数组中包含了AccountImpl和版本信息(时间,版本等)
//fasle 结果集为AccountImpl的List
//第三个参数selectDeletedEntities(是否查询删除操作的版本)
//AuditQuery query = auditReader.createQuery().forRevisionsOfEntity(AccountImpl.class, true, false);
 

2. 添加查询信息

a. addProjection (AuditProjection projection)查询字段或统计

  • 查询 : 所需字段,不重复值(distinct)
  • 统计 : 数量(count),不重复值数量(distinctCount),最大值(max),最小值(min)等

如:

查询Accout的name字段可添加:

query.addProjection(AuditEntity.property("name")); 
 

查询name和password可 添加:

query.addProjection(!AuditEntity.property("password")); 
 

去除重复的name:

query.addProjection(!AuditEntity.property("name") .distinct()  ); 
 

统计年龄的最大值:

query.addProjection(!AuditEntity.property("age") .max()  ); 
 

 

b. add (AuditCriterion criterion)添加限制条件

  • 具体值 等于(eq),不等于(ne),大于(gt),大于等于(ge),小于(lt),小于等于(le),在两个值之间(between),在某些值中(in)
  • 另一字段的值 等于(eqProperty),不等于(neProperty),大于(gtProperty),大于等于(geProperty),小于(ltProperty),小于等于(leProperty)
  • 是否为空 为空(isNull),不为空(isNotNull)
  • 模糊查询 like(Object value), like(String value, MatchMode matchMode) matchMode的值在类MatchMode中定义,有ANYWHERE,START,END,EXACT

如:

查询name为admin的Account信息可添加:

query.add(AuditEntity.property("name").eq("admin") ); 
 

 

c. addOrder (AuditOrder order) 排序

  • 升序(asc),降序(desc)

如:

按name升序添加:

query.add(AuditEntity.property("name").asc() ); 
 

 

d. 结果集数量限制 setFirstResult(int firstResult),setMaxResults(int maxResults) 如:

返回5条结果集:

query.setMaxResults(5)
 

3. 获取查询结果

  1. 结果集 getResultList()
  2. 单条数据 getSingleResult()

如:

返回结果集:

query.getResultList();
 

你可能感兴趣的:(查询)