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

ObjectBox关联查询问题求助:Person与Address字段查询无结果

问题描述

我此前十分喜爱这个包,因为它实用且易于理解。我的实体类代码如下:

@Entity()
class Person {
    int id;
    String name;
    final address = ToOne<Address>();
}

@Entity()
class Address {
    int id;
    String street;
    String zip;
}

我想要查询Person的name和Address的street字段,但执行以下查询代码时:

box.query(Person_.name.contains(search_value))..link(Person_.address, Address_.street.contains(search_value));

即便搜索字符存在于Person的name或Address的street中,也无法得到结果,请问我的代码是否存在问题?


问题分析与解决

你这段代码的问题在于link()方法的逻辑是同时满足两个条件(相当于SQL里的AND),但你需要的是「Person的name包含搜索值,或者关联的Address的street包含搜索值」的二选一匹配(OR关系),所以原查询只会返回同时满足两个条件的结果,自然得不到你想要的效果。

要实现需求,得把两个条件用or()组合起来,这里提供两种可行写法:

写法一(兼容多数ObjectBox版本)

// 条件1:Person的name包含搜索关键词
final nameCondition = Person_.name.contains(search_value);
// 条件2:获取关联Address的street符合条件的Person ID列表
final matchedPersonIds = box.query(Person_.address.exists())
    .link(Person_.address, Address_.street.contains(search_value))
    .build()
    .find()
    .map((person) => person.id)
    .toList();

// 组合两个条件,取OR关系
final query = box.query(
  nameCondition.or(Person_.id.oneOf(matchedPersonIds))
).build();
final results = query.find();

写法二(ObjectBox 2.0+版本支持)

如果你的ObjectBox版本是2.0及以上,可以用更简洁的target()语法直接关联查询:

final query = box.query(
  Person_.name.contains(search_value)
  .or(Person_.address.target(Address_.street.contains(search_value)))
).build();
final results = query.find();

另外需要注意两个细节:

  • 确保search_value不是空字符串,否则会匹配所有数据,影响查询准确性
  • 检查Person与Address的关联是否正确保存,没有关联Address的Person不会被第二个条件命中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:30:46