如何使用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
相关产品推荐
相关产品推荐

