今天在整理一个 SAP BTP 上的 CAP 项目时,我又一次碰到一个很典型的问题。Service handler 里只是想查几本书、更新一下库存、根据订单状态做条件扣减,代码看起来不复杂,可一旦逻辑开始牵涉分页、关联展开、深层订单行、聚合统计、库存并发扣减,普通 SQL 思维很快就会让代码变得发散。这里真正该被放到台前的,不只是数据库查询,而是 CAP 提供的 CQL,也就是 CDS Query Language。CQL 很容易被误解成 SQL 的另一个包装层。这个理解只对了一半。它确实接近 SQL,也继承了 SELECT、INSERT、UPDATE、DELETE 这些开发人员熟悉的表达方式,但在 CAP 里,它更像一个连接业务模型、服务运行时和底层数据库的中间语言。我们的 CDS 模型定义了实体、字段、关联、组合和服务边界,CQL 则负责把这些模型对象变成可执行的数据访问意图。它不要求我们每一次都把 JOIN、字段别名、参数绑定和对象结构拆成手写 SQL,而是把这些动作放回 CAP 的模型语境里。从最常见的 SELECT 开始,CAP Node.js 里的写法非常直接。假设我们的模型里有 Books 和 Authors 两个实体,代码通常从cds.entities拿到实体定义,再通过 SELECT 构建查询。const{Books,Authors