Access Custom Metadata Type Records Using Static Methods


In the Salesforce Spring ’21 release, there’s no longer a necessity to craft Salesforce Object Query Language (SOQL) to access Custom Metadata Type in Apex. Salesforce has introduced new methods similar to accessing custom settings.

Prior to the Spring ’21 release, the only way to access Custom Metadata Type Records in Apex was through SOQL queries like the example below:

// Before Spring 21
List<Country_Code__mdt> listCountryCode = [SELECT Id,Label,MasterLabel,Country_Code__c,DeveloperName from Country_Code__mdt];
      
for(Country_Code__mdt c : listCountryCode){
           System.debug('Label ->'+ c.Label + ',' + 'Country code ->' + c.Country_Code__c + ',' +'Devloper name ->' + c.DeveloperName);
      }
/* OUTPUT
 * Label -> CANADA,Country code ->CAN,Devloper name ->CANADA
 * Label -> INDIA,Country code ->IND,Devloper name ->INDIA
 * Label -> UNITED STATES,Country code ->UNS,Devloper name ->UNITED STATES

The Salesforce Spring ’21 release offers an alternative approach to accessing Custom Metadata Type records through static methods without using SOQL.

Utilizing Apex’s getAll(), getInstance(recordId), getInstance(qualifiedApiName), and getInstance(developerName) methods allows for faster retrieval of information from custom metadata type records. These methods bypass the SOQL engine and directly return the sObject details upon invocation. Below are several advantages of employing these methods:

  1. Eliminates the necessity for Salesforce Object Query Language (SOQL).
  2. Circumvents any SOQL limitations.
  3. Streamlines and accelerates code development.

Let’s explore each method with an example:

getAll() This method retrieves a map containing custom metadata records for the specific custom metadata type. The map’s keys represent the Record ID, while the map’s values represent the sObject records.

List<Country_Code__mdt> listCountryCode = Country_Code__mdt.getAll().values();
      
for(Country_Code__mdt c : listCountryCode){
           System.debug('Label ->'+ c.Label + ',' + 'Country code ->' + c.Country_Code__c + ',' +'Devloper name ->' + c.DeveloperName);
      }
/* OUTPUT
 * Label -> CANADA,Country code ->CAN,Devloper name ->CANADA
 * Label -> INDIA,Country code ->IND,Devloper name ->INDIA
 * Label -> UNITED STATES,Country code ->UNS,Devloper name ->UNITED STATES
    • getInstance(recordId)
    It returns a single custom metadata type sObject record for a specified record ID.
Country_Code__mdt CountryCodeRecord = Country_Code__mdt.getInstance('m022w000000lPl8AAE');
System.debug('Label ->'+ CountryCodeRecord.Label + ',' + 'Country code ->' + CountryCodeRecord.Country_Code__c);
/*OUTPUT
 * Label ->CANADA,Country code ->CAN
*/
  • getInstance(developerName)

It returns a single custom metadata type sObject record for a specified developerName field of the custom metadata type object.

Country_Code__mdt CountryCodeRecord = Country_Code__mdt.getInstance('CANADA');
System.debug('Developer Name ->'+ CountryCodeRecord.DeveloperName + ',' + 'Country code ->' + CountryCodeRecord.Country_Code__c);
/*OUTPUT
 * Developer Name->CANADA,Country code ->CAN
*/

  • getInstance(qualifiedApiName)
It returns a single custom metadata type sObject record for a qualified API name specified as parameter

Country_Code__mdt CountryCodeRecord = Country_Code__mdt.getInstance('INDIA');
System.debug('Label ->'+ CountryCodeRecord.Label + ',' + 'Country code ->' + CountryCodeRecord.Country_Code__c);
/*OUTPUT
 * Label->INDIA,Country code ->IND
*/