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
相关产品推荐
相关产品推荐

