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
相关产品推荐
相关产品推荐

