我正处于 Salesforce Apex 的学习阶段。我已阅读 Dynamic Apex 的主题,但无法理解该概念。有人可以解释一下如何处理它以及最好在哪些情况下使用?提前致谢。
1 回答
用例 1:
您正在开发一个页面,该页面读取 salesforce 对象元数据以向用户显示对象记录。您想使用 describe 全局方法,但不知道如何将标准 SOQL 与泛型SObject
类型结合起来。
标准 SOQL 例如
Person__c [] persons = [SELECT Id, Name, Age__c, Height__c FROM Person__c];
但是 describe 全局元数据方法返回一个 SObject 类型。
解决方案:
使用 describe 全局方法获取对象列表,然后进一步获取该对象上的所有字段。在包含所有字段的本地字符串变量中构建一个 SELECT 语句,然后使用Database.query()
.
string objectfullname = 'scenario__c';
Schema.SObjectType targetType = Schema.getGlobalDescribe().get('scenario__c');
if (targetType == null) {
system.debug('Type not found: '+objectFullname);
throw new TypeNotFoundException(objectFullName);
}
Schema.DescribeSObjectResult typedescription = targetType.getDescribe();
Map<String, schema.Sobjectfield> resultMap = typedescription.Fields.getMap();
string query = 'SELECT ' + string.join(new List<string>(resultMap.keySet()), ',') + ' FROM '+ objectfullname + ' LIMIT 100';
sobject [] records = Database.query(query);
用例 2
您希望将代码与 beta 托管打包中的自定义对象松散耦合,以便可以卸载和升级托管打包。
解决方案
当您使用该Database.query()
方法时,您的代码不会针对自定义对象进行编译,因此可以重新安装它,而无需注释掉代码以删除依赖关系。
用例 3
您有一个触发器,可在插入后根据动态字段映射架构将记录复制到另一个自定义对象。您不能以标准方式对其进行编码,[SELECT ...]
因为您只知道在运行时要插入的对象。
解决方案
同样,使用 describe 全局方法和 Database.query 获取记录和类型信息,然后您可以像普通 DML 一样插入目标对象。
sobject newRecord = ...
for (integer i = 0; i < fieldCount; i++) {
newRecord.put(fields[i],values[i]);
}
insert newRecord;
如果您像往常一样进行批量插入,请确保不要将 DML(插入、更新)语句放在循环中。