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

如何为ObjectBox查询条件性添加查询条件?

问题

我有一个查询所有Clientes的方法:

static Future<List<Cliente>> findAll({
  int limit = 50,
  String? cnpjCpf,
  String? fantasia,
}) async {
  List<Cliente> clientes = [];

  final boxCliente = objectBox.store.box<Cliente>();

  Query<Cliente> query = boxCliente
      .query(Cliente_.cnpjCpf
          .contains(cnpjCpf ?? "")
          .or(Cliente_.fantasia.contains(fantasia ?? "")))
      .order(Cliente_.fantasia)
      .build();

  query.limit = limit;

  clientes = await query.findAsync();

  return clientes;
}

现在我不想像示例那样添加所有条件,而是需要条件性地添加查询条件,即当cnpjCpf不为空时,才将其添加到QueryBuilder中。我尝试了如下写法:

static Future<List<Cliente>> findAll({
  int limit = 50,
  String? cnpjCpf,
  String? fantasia,
}) async {
  List<Cliente> clientes = [];

  final boxCliente = objectBox.store.box<Cliente>();

  final queryBuilder = boxCliente.query();

  if (cnpjCpf != null && cnpjCpf.isNotEmpty) {
    queryBuilder.equal(Cliente_.cnpjCpf, cnpjCpf);
  }

  if (fantasia != null && fantasia.isNotEmpty) {
    queryBuilder.contains(Cliente_.fantasia, fantasia);
  }

  queryBuilder.order(Cliente_.fantasia);

  Query<Cliente> query = queryBuilder.build();

  query.limit = limit;

  clientes = await query.findAsync();

  return clientes;
}

但发现QueryBuilder对象没有equal或contains方法,请问正确的实现方式是什么?

解决方案

ObjectBox的QueryBuilder需要通过组合Condition对象来构建查询条件,而非直接调用equal/contains这类方法。正确的做法是先初始化一个可空的Condition变量,根据参数是否存在逐步拼接条件,再将最终的Condition传入查询构建器。

实现代码

static Future<List<Cliente>> findAll({
  int limit = 50,
  String? cnpjCpf,
  String? fantasia,
}) async {
  final boxCliente = objectBox.store.box<Cliente>();
  Condition<Cliente>? condition;

  // 条件性添加cnpjCpf的查询条件
  if (cnpjCpf != null && cnpjCpf.isNotEmpty) {
    condition = Cliente_.cnpjCpf.contains(cnpjCpf);
  }

  // 条件性添加fantasia的查询条件,与已有条件用AND逻辑拼接
  if (fantasia != null && fantasia.isNotEmpty) {
    final fantasiaCondition = Cliente_.fantasia.contains(fantasia);
    condition = condition == null 
        ? fantasiaCondition 
        : condition.and(fantasiaCondition);
  }

  // 构建查询:无任何条件时传null表示查询全部数据
  final queryBuilder = boxCliente.query(condition)
      .order(Cliente_.fantasia);

  final query = queryBuilder.build()..limit = limit;
  
  return await query.findAsync();
}

关键说明

  • 用可空的Condition<Cliente>变量存储逐步组合的条件,初始值为null。
  • 每个不为空的参数对应创建一个Condition对象,再通过and()或or()与已有条件拼接(根据业务逻辑选择逻辑运算符)。
  • 若最终无任何条件,向boxCliente.query()传入null即可查询所有数据。
  • 后续的排序、分页逻辑和原代码保持一致。

如果业务需求是多个条件用OR逻辑关联,只需将condition.and(fantasiaCondition)替换为condition.or(fantasiaCondition)。

内容的提问来源于stack exchange,提问作者Nickolas de Luca Alberton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:59:51