Hibernate Envers使用IN条件过滤审计数据报错求解决方案
解决Hibernate Envers关联属性IN筛选报错问题
问题原因
你代码里的state是关联实体(比如@ManyToOne关联的对象),Envers不允许直接对关联实体对象使用in条件,必须针对关联实体的**基本类型属性(如主键ID)**进行筛选。
解决方案一:针对关联属性的主键字段筛选
修改查询条件,指定关联实体的主键字段(比如state.id),示例代码:
AuditQuery auditQ = auditReader.createQuery() .forRevisionsOfEntity(TABLEX.class, false, true) .add(AuditEntity.property("state.id").in(listStateIds));
如果关联实体的筛选字段不是主键,只要是基本类型(如String、Integer)也可以,比如state.code:
.add(AuditEntity.property("state.code").in(listStateCodes));
解决方案二:使用原生SQL查询
Envers支持原生SQL查询,直接操作审计表(默认命名规则是原表名加_AUD,比如TABLEX的审计表是TABLEX_AUD)。示例代码:
String nativeSql = "SELECT * FROM TABLEX_AUD ta " + "WHERE ta.state_id IN (:stateIds) " + "ORDER BY ta.REV ASC"; Query nativeQuery = auditReader.createNativeQuery(nativeSql, TABLEX.class); nativeQuery.setParameter("stateIds", listStateIds); List<TABLEX> result = nativeQuery.getResultList();
注意:
- 审计表包含Envers自动添加的字段:
REV(修订版本号)、REVTYPE(操作类型:0=新增,1=修改,2=删除),可根据业务需求添加筛选或排序逻辑。 - 如果关联实体也开启了审计,需要关联对应的审计表进行联合查询;若仅需主表审计数据,直接筛选主表的关联字段即可。
内容的提问来源于stack exchange,提问作者t1daz
相关产品推荐
相关产品推荐

