Salesforce中SOQL查询Lookup字段返回(null <object__r>)问题解决
问题分析与解决方案
针对你遇到的Sdf__c关联SdfBudget__c返回(null <object__r>)且调试日志无法打印关联字段的问题,以下是具体排查点和解决方法:
1. 检查Lookup字段的API名称正确性
SOQL中关联查询的__r后缀对应的是Lookup字段的API名(去掉__c后加__r)。如果你的Lookup字段API名是SdfBudget__c(而非Sdf_Budget__c),那原SOQL里的Sdf_Budget__r就是错误的,会导致关联查询失效,返回null。
修正后的SOQL:
sdfItems=[SELECT Name,VBU__c,SdfBudget__r.Budget__c FROM sdf__c WHERE VBU__c IN :vbuValues];
2. 验证Lookup字段的实际关联关系
即使VBU__c值匹配,也需要确认Sdf__c记录的Lookup字段确实指向了对应的SdfBudget__c记录:
- 打开一条符合查询条件的Sdf__c记录,手动检查其Lookup字段(比如名为“Sdf Budget”的字段)是否已关联到存在的SdfBudget__c记录,且该SdfBudget__c的VBU__c值与Sdf__c的VBU__c完全一致(注意大小写、空格等文本细节)。
3. 正确调试关联字段
直接打印List<Sdf__c>时,Salesforce调试日志默认不会展开__r关联对象的字段。你需要改为循环打印每个记录的具体字段,或用JSON序列化查看完整数据:
// 循环打印单条记录的关联字段 for(Sdf__c item : sdfItems) { String budgetVal = item.SdfBudget__r != null ? item.SdfBudget__r.Budget__c : '无关联预算'; System.debug('Sdf记录:Name=' + item.Name + ', VBU=' + item.VBU__c + ', 预算=' + budgetVal); } // 或用JSON序列化查看完整数据结构 System.debug('完整Sdf数据:' + JSON.serializePretty(sdfItems));
4. 优化查询逻辑(可选)
你可以合并两次查询为一次子查询,减少代码量并避免循环收集VBU值的潜在问题:
List<Sdf__c> sdfItems = [ SELECT Name, VBU__c, SdfBudget__r.Budget__c FROM Sdf__c WHERE VBU__c IN (SELECT VBU__c FROM SdfBudget__c WHERE VBU__c != null) ];
内容的提问来源于stack exchange,提问作者Jilnesh Ajay Jîllu
相关产品推荐
相关产品推荐

