You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:18:10