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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:06