鸿蒙next谓词的核心设计理念

66 阅读2分钟

⚙️ 1. 谓词的核心设计理念

  • 链式条件组合
    鸿蒙的 RdbPredicatesDataSharePredicates 通过条件方法(如 equalTogreaterThan)直接构建查询条件,无需手动编写 WHERE
    示例:匹配 name"Rose" 的记录

    let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
    predicates.equalTo("name", "Rose"); // 隐式生成 WHERE name = 'Rose'
    
  • 条件方法替代 WHERE
    所有条件方法(如 likebetween)的调用即等价于在 SQL 的 WHERE 子句中添加条件。


📋 2. 支持的常用谓词方法

以下是鸿蒙谓词的核心方法(对标 SQL 操作):

谓词方法SQL 等价操作示例代码说明
equalTo(field, value)field = valuepredicates.equalTo("age", 28)精确匹配
notEqualTo(field, value)field != valuepredicates.notEqualTo("name", "Rose")不等于匹配
contains(field, value)field LIKE '%value%'predicates.contains("title", "Harmony")模糊匹配(包含字符串)
beginsWith(field, value)field LIKE 'value%'predicates.beginsWith("path", "/doc")匹配开头字符串
endsWith(field, value)field LIKE '%value'predicates.endsWith("email", "@huawei.com")匹配结尾字符串
between(field, low, high)field BETWEEN low AND highpredicates.between("salary", 5000, 10000)范围匹配(闭区间)
greaterThan(field, value)field > valuepredicates.greaterThan("timestamp", 1620000000)大于匹配

💡 更多方法见官方文档:DataSharePredicates API


🧩 3. 复杂条件构建(替代 WHERE 组合)

鸿蒙通过 括号包裹逻辑连接符 实现复杂条件:

  • 括号分组beginWrap()endWrap() 实现条件优先级

    predicates.equalTo("department", "IT")
      .beginWrap() // 相当于 (
      .equalTo("level", 3)
      .or()       // OR
      .greaterThan("salary", 15000)
      .endWrap(); // 相当于 )
    

    生成的 SQL:

    WHERE department = 'IT' AND (level = 3 OR salary > 15000)
    
  • 逻辑运算符

    • and():逻辑与(默认条件间即为 AND,可省略)
    • or():逻辑或
    predicates.equalTo("status", 1).or().equalTo("priority", 5);
    // 等价于:status = 1 OR priority = 5
    

🧪 4. 完整示例:查询年龄≥25 且部门为“HR”或“Finance”的员工

import { relationalStore } from '@kit.ArkData';

// 1. 创建谓词对象
let predicates = new relationalStore.RdbPredicates("Employees");

// 2. 构建复杂条件
predicates.greaterThanOrEqualTo("age", 25) // age >= 25
  .and()
  .beginWrap() // 分组开始
    .equalTo("department", "HR")
    .or()
    .equalTo("department", "Finance")
  .endWrap() // 分组结束
  .orderByAsc("name"); // 按姓名升序排序

// 3. 执行查询
let resultSet = await rdbStore.query(predicates, ["id", "name", "age"]);

生成的 SQL 逻辑:

SELECT id, name, age FROM Employees 
WHERE age >= 25 
  AND (department = 'HR' OR department = 'Finance')
ORDER BY name ASC;

推荐优先使用 RdbPredicates 的链式条件,兼顾安全性与可读性 ✅。