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

如何使用Example Matcher实现嵌套字段未完全填充时忽略空值匹配

问题原因

你使用的Spring Data MongoDB(@Document为Spring Data MongoDB专属实体注解)的Example查询默认仅忽略根实体的null属性,嵌套对象内部的null属性会被直接作为查询条件,要求数据库对应字段值也为null。
你提交的查询实际会匹配b.value2 = null AND b.value3 = null,和库里存储的非空值不匹配,因此查询无结果。

解决方案

自定义ExampleMatcher,配置忽略嵌套对象的null属性即可,两种常用配置方式如下:

方式1:全局忽略所有null属性(推荐)

适用于不确定会有多少嵌套字段为null的场景,Spring Data Commons 2.0+版本支持该配置自动处理所有层级的null属性:

// 构造自定义匹配器
ExampleMatcher matcher = ExampleMatcher.matching()
        // 全局忽略所有层级的null属性
        .withIgnoreNullValues();

// 传入匹配器构造查询Example
Example<A> queryExample = Example.of(new A("val", new B("val1", null, null)), matcher);
// 执行查询
List<A> results = repository.findAll(queryExample);

方式2:显式指定忽略指定嵌套字段

适用于低版本Spring Data,或者需要精确控制忽略字段的场景:

ExampleMatcher matcher = ExampleMatcher.matching()
        // 显式指定忽略B类的value2、value3字段匹配
        .withIgnorePaths("b.value2", "b.value3");

Example<A> queryExample = Example.of(new A("val", new B("val1", null, null)), matcher);
List<A> results = repository.findAll(queryExample);
注意事项
  • 嵌套对象本身不能为null,如果你传入的b字段为null,查询会默认忽略整个嵌套对象的匹配规则
  • 如果需要字符串模糊匹配、大小写忽略等规则,可以在ExampleMatcher中追加对应配置,比如全局字符串包含匹配可以追加.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 20:24:02