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的绑定变量机制会在执行时自动替换为对应变量的取值,不需要手动拼接字符串,这个逻辑没有问题。
修复方案
修复思路如下:
- 用List接收动态查询结果,避免空结果直接抛出异常,查询后判断列表长度再取值
- 提前校验
name变量非空再执行查询 - else分支也明确指定语言筛选条件,避免隐含过滤逻辑影响结果
- 可选:增加权限校验,确保当前用户有访问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
相关产品推荐
相关产品推荐

