在Apex中,关于RecordTypeId的取得的知识点
2023年08月13日
文章浏览:329
为什么会有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查询多几次,那么会严重影响资源的充裕程度。

DescriptionSynchronous LimitAsynchronous Limit
Total number of SOQL queries issued1100200





②使用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);






关注 收藏
2023年08月13日

都用过,原来有这种区别,感谢分享!

回复
yusizhong 回复 jowell.qiao 哈哈,是的。我也是最近在推进公司的代码规范,也才知道的这些区别。
回复