Hibernate @FilterDef defaultCondition默认条件不生效问题
Hibernate @FilterDef defaultCondition 不生效问题排查
核心原因
Hibernate @FilterDef 注解中的defaultCondition属性 不具备自动为声明参数赋值的能力,这是绝大多数开发者使用过滤器时的常见认知误区:
defaultCondition仅作为过滤器SQL片段的默认模板:当实体类上的@Filter注解未单独指定condition属性时,Hibernate会直接使用该值作为追加到查询语句的条件模板。- 只要你在
@FilterDef的parameters列表中声明了参数,Hibernate在启用过滤器时就会强制校验所有参数是否已赋值,不会自动解析defaultCondition中的固定值为参数填充,因此直接调用enableFilter不传入参数会抛出参数未设置的异常。
解决方案
根据业务场景二选一即可:
场景1:过滤条件固定为isDomainRelevant = true,无需动态传值
直接删除@FilterDef中多余的parameters声明即可,修改后的实体注解代码如下:
@Getter @Setter @ToString @NoArgsConstructor @AllArgsConstructor @Entity(name = "ASSET_TYPE") @FilterDef(name="PartnerFilter", defaultCondition = "isDomainRelevant = true") @Filter(name = "PartnerFilter") public class AssetTypeEntity implements IdEntity<UUID> { // 实体属性定义 }
修改后直接调用session.enableFilter("PartnerFilter")即可正常生效,无需传入任何参数,Hibernate会自动将固定条件拼接到查询SQL中。
场景2:需要动态切换isDomainRelevant取值,仅默认场景使用true
Hibernate没有提供注解层面的参数默认值配置能力,可以自行封装过滤器启用的工具方法,在方法内部实现默认值赋值逻辑,示例代码如下:
/** * 启用合作伙伴过滤器 * @param session Hibernate Session实例 * @param isDomainRelevant 域关联标记,传null时默认使用true */ public static Filter enablePartnerFilter(Session session, Boolean isDomainRelevant) { Filter enabledFilter = session.enableFilter("PartnerFilter"); enabledFilter.setParameter("isDomainRelevant", isDomainRelevant != null ? isDomainRelevant : true); return enabledFilter; } // 默认场景直接调用,无需传参 Session session = ((EntityManager) retVal).unwrap(Session.class); enablePartnerFilter(session, null); // 需要动态调整条件时传入对应值即可 // enablePartnerFilter(session, false);
注意事项
- 不要混淆
defaultCondition和参数默认值的作用:defaultCondition只是SQL模板,和参数赋值逻辑完全无关。 - 如果过滤条件是固定值,不要在
@FilterDef中声明对应的ParamDef,否则会触发Hibernate的参数非空校验,导致报错。
内容的提问来源于stack exchange,提问作者Lokesha S
相关产品推荐
相关产品推荐

