Salesforce APEX执行SOQL时__r.Name字段返回空值问题
APEX执行SOQL时Lookup关联Name字段返回null问题排查
问题场景
- 业务代码中使用的SOQL语句如下:
Case carrierList= [SELECT Id, CaseNumber, Current_Quoted_By_Carrier__c, Current_Quoted_By_Carrier__r.Name, Quoted_By_Carrier__c, Quoted_By_Carrier__r.Name FROM Case WHERE Id = :con.Id];
- 字段属性说明:
Case.Quoted_By_Carrier__c为指向Account对象的Lookup查找关联字段。 - 异常表现:
在Workbench或Developer Console中使用个人账号执行相同SOQL时,关联对象的Name字段可以正常返回值;但在APEX运行环境中执行该SOQL时,仅能返回关联记录ID,对应Name字段取值为空,DEBUG日志输出为:
DEBUG|Quoted by Carrier Name = null。
核心产生原因
- 权限不匹配:Workbench/Developer Console执行SOQL时使用的是当前登录的高权限账号(通常是系统管理员),而APEX代码的运行上下文可能是权限不足的用户(比如集成用户、社区用户、普通业务用户):
- 若运行用户没有
Case.Quoted_By_Carrier__c字段的读取权限,或没有Account对象Name字段的读取权限,平台会自动过滤无权限的字段值,仅返回用户有权限查看的Lookup ID。 - 若APEX类使用
with sharing修饰,运行用户没有关联Account记录的共享访问权限,平台也会隐式屏蔽关联对象的字段内容,仅保留Lookup ID。
- 若运行用户没有
- 代码逻辑覆盖查询结果:SOQL执行完成后,后续代码存在误操作覆盖了关联对象实例,比如编写了
carrierList.Quoted_By_Carrier__r = new Account();这类未给Name字段赋值的语句,会把查询到的关联对象信息替换为空实例,后续读取Name自然返回null。 - 极端配置异常:如果Lookup字段曾经修改过关联对象、或平台侧关联索引损坏,也可能出现这类读取异常,该类场景出现概率极低。
可行解决方案
- 权限类问题修复
- 先在代码中添加
System.debug('当前运行用户ID:' + UserInfo.getUserId());打印日志,确认APEX实际运行的上下文用户。 - 检查该用户绑定的配置文件、权限集,确认已开通Case对象
Quoted_By_Carrier__c字段的读取权限,同时开通Account对象Name字段的读取权限。 - 若为共享规则限制,评估业务场景后,可选择给对应用户补充分配关联Account数据的访问权限,或在确认数据安全的前提下将对应APEX类修改为
without sharing模式绕过共享校验。
- 先在代码中添加
- 代码逻辑类问题修复
- 在SOQL语句执行完成的下一行立刻打印
carrierList.Quoted_By_Carrier__r.Name的值,确认是查询阶段就未返回值,还是后续逻辑覆盖导致的null。 - 如果存在后续操作关联对象字段的逻辑,不要直接覆盖整个
Quoted_By_Carrier__rsObject实例,仅针对需要修改的单个字段赋值即可。
- 在SOQL语句执行完成的下一行立刻打印
- 极端配置问题修复
若确认权限、代码逻辑均无问题,可进入字段配置页重新保存Quoted_By_Carrier__c字段的配置,触发平台重新构建关联索引即可恢复。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

