Realm Java子对象查询:如何精准筛选符合子项条件的父对象
问题分析与解决方案
你的问题出在查询逻辑的范围上:当前的查询会匹配父对象的子集合里有任意一个叫Jessica的子,并且有任意一个年龄为17的子(这两个子可以是不同的),所以第二个父对象里既有Lawson(17岁)又有Jessica(19岁),也会被命中。
而你需要的是父对象中存在至少一个子对象同时满足「名字是Jessica」且「年龄是17」,这时候需要把两个条件绑定到同一个子对象上,以下是两种可行的写法:
方法1:使用查询字符串(简洁直观)
realm.where(Parent.class) .filter("ANY (children.name == 'Jessica' AND children.age == 17)") .findAll();
这里的ANY关键字指定了:我们要找的是父对象的子集合中,至少有一个子对象同时满足括号内的所有条件,这样就能精准筛选出第一个父对象。
方法2:使用链式子查询(类型更安全)
如果更倾向于链式API的写法,可以先定义子对象的查询条件,再关联到父对象查询:
// 先定义符合条件的子对象查询 RealmQuery<Child> targetChildQuery = realm.where(Child.class) .equalTo("name", "Jessica") .equalTo("age", 17); // 查询拥有该子对象的父对象 RealmResults<Parent> result = realm.where(Parent.class) .contains("children", targetChildQuery) .findAll();
为什么原查询不生效?
原代码中的分组查询:
realm.where(Parent.class).beginGroup().equalTo("children.name","Jessica").equalTo("children.age","17").endGroup().findAll();
Realm会将其解析为两个独立的条件:
- 父对象的子集合中存在name为Jessica的元素
- 父对象的子集合中存在age为17的元素
这两个条件不需要由同一个子对象满足,所以第二个父对象也会被返回。
内容的提问来源于stack exchange,提问作者JR Tan
相关产品推荐
相关产品推荐

