为什么会有Governor限制。
大家都知道,Salesforce是云计算,说得更简单点,就是租赁。
所以Salesforce的自定义开发有他自己的特点,既然是租赁,那么这个平台的提供方(Salesforce公司)就需要制定出一套计算机资源(CPU,内存,存储)更加合理的使用规则。
这就是Apex Governor Limits。
写过Apex的朋友,大家可能知道,想取得RecordTypeId,可能有多种方法。
在这里,我就把所有取得RecordTypeId的方法给整理出来,并附上推荐与否的建议。
①直接从RecordType Object里面进行SOQL查询(极力不推荐)
代码如下
List<RecordType> recordTypeList = [
SELECT Id
FROM RecordType
WHERE SobjectType = :objectName AND DeveloperName = :recordTypeName];
或者下面的写法
String gsRecordTypeID = [SELECT id FROM RecordType WHERE name = 'GS' and SobjectType ='Case'].Id;
给出的建议就是极力不推荐这种使用方法,因为每次从RecordType Object进行查询 ,都要消耗一次【SOQL queries】
在同步模式下,一次处理(Transaction)的SOQL查询限制只有100,
所以如果这样的RecordType查询多几次,那么会严重影响资源的充裕程度。
Description | Synchronous Limit | Asynchronous Limit |
---|---|---|
Total number of SOQL queries issued1 | 100 | 200 |
②使用Schema命名空间下面的SObjectType方法来取得RecordTypeId(推荐)
String devRecordTypeId1 = Schema.SObjectType.Case.getRecordTypeInfosByName().get('お客さん問い合わせ').getRecordTypeId();
system.debug('devRecordTypeId1---------->'+devRecordTypeId1);
String devRecordTypeId2 = Schema.SObjectType.Case.getRecordTypeInfosByDeveloperName().get('CustomerInquiry').getRecordTypeId();
system.debug('devRecordTypeId2---------->'+devRecordTypeId2);
③使用Schema命名空间下面的getGlobalDescribe方法来取得RecordTypeId(非常推荐)
我们可以指定Object的名称,还有RecordType的名称
设置好了上面的两个参数之后,我们就可以动态的取得RecordTypeId
Id devRecordTypeId3 = Schema.getGlobalDescribe().get('Case').getDescribe().getRecordTypeInfosByName().get('record type inner').getRecordTypeId();
system.debug('devRecordTypeId3---------->'+devRecordTypeId3);