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

Salesforce含参数动态SOQL查询执行失败问题求助

故障原因

  • 直接将Database.query()返回结果赋值给单个sObject实例:动态SOQL查询如果没有匹配到任何记录,会直接抛出QueryException: List has no rows for assignment to SObject异常,这是本次执行失败的最常见诱因。
  • 未校验绑定变量的合法性:代码中未提前校验:name变量是否为空,若name没有正确赋值或为空,UrlName = :name的筛选条件会匹配不到任何结果。
  • 未明确指定语言筛选规则:走else分支时查询语句没有加Language条件,Knowledge__kav对象默认会用当前上下文用户的语言作为隐含筛选条件,若对应UrlName的文章没有该语言的已发布版本,也会返回空结果。
  • 补充说明:你debug输出的查询语句中保留:name、:publishStatusOnline这类占位符是正常的,动态SOQL的绑定变量机制会在执行时自动替换为对应变量的取值,不需要手动拼接字符串,这个逻辑没有问题。

修复方案

修复思路如下:

  1. 用List接收动态查询结果,避免空结果直接抛出异常,查询后判断列表长度再取值
  2. 提前校验name变量非空再执行查询
  3. else分支也明确指定语言筛选条件,避免隐含过滤逻辑影响结果
  4. 可选:增加权限校验,确保当前用户有访问Knowledge__kav已发布文章的权限

修复后代码示例:

// 提前校验入参合法性
if(String.isBlank(name)) {
    return null;
}
String knowledgeQuery = '';
String publishStatusOnline = 'Online';
// 目前'Knowledge__kav'仅支持'is-is'和'en-us'两种语言
if(language == 'is-is'){
    language = 'is';
    knowledgeQuery = 'SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline AND Language = :language ORDER BY VersionNumber DESC LIMIT 1';
} else {
    // else分支明确指定默认语言,避免隐含过滤
    language = 'en_US';
    knowledgeQuery = 'SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline AND Language = :language ORDER BY VersionNumber DESC LIMIT 1';
}

System.debug(knowledgeQuery);
// 用List接收结果,避免空结果抛异常
List<Knowledge__kav> articleList = Database.query(knowledgeQuery);
if(articleList.size() > 0) {
    return articleList[0];
}
return null;

内容的提问来源于stack exchange,提问作者JonB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:45:01