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

