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

Spring JPA Example查询自动添加createdBy等字段至WHERE子句原因咨询

问题原因分析

Spring Data JPA的Example查询核心逻辑是基于传入实体对象的所有非空/非默认值字段生成WHERE条件,而且会自动包含父类继承来的字段,这就是你看到createdBy、lastModifiedBy被加入查询条件的原因,具体拆解:

  • 字段非空触发匹配:你用来构建Example的TestEntity实例中,EntityCommonBase父类的createdBy、lastModifiedBy字段并非null(比如被Spring Data JPA的审计自动填充、父类字段有初始化值、或者你在实例化时没显式置空),Example会默认把所有非空字段都当作查询条件。
  • Example不区分业务/通用字段:Example本身没有能力识别哪些是你业务上用来查询的字段(testId、status),哪些是通用审计字段,它只会遍历实体的所有字段(包括继承的),根据字段的非空状态和匹配规则生成条件。
  • 默认匹配规则的影响:默认的ExampleMatcher会匹配所有非空字段,不会自动忽略父类的通用字段,除非你显式配置忽略规则。
解决办法

针对这个场景,最简单的处理方式是通过ExampleMatcher显式忽略父类的审计字段:

// 1. 创建查询用的TestEntity实例
TestEntity probe = new TestEntity();
probe.setTestId(xxx);
probe.setStatus(xxx);

// 2. 配置ExampleMatcher,忽略父类的审计字段
ExampleMatcher matcher = ExampleMatcher.matching()
    .withIgnorePaths("id", "createdBy", "lastModifiedBy");

// 3. 构建Example并查询
Example<TestEntity> example = Example.of(probe, matcher);
List<TestEntity> result = testEntityRepository.findAll(example);

另外也可以在构建查询实例时,显式将父类的审计字段设为null,但这种方式不如配置ExampleMatcher可靠,因为如果审计框架自动填充了字段值,还是会被纳入查询条件。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:33:14