Получение метаданных в Apex

На этапе сертификации DEV 1 столкнулся с набором вопросов которые касались работы с метаданными в Apex. Решил собрать информацию, которая пригодятся не только на этапе сертификации, но и в повседневной работе.

1. Вступление
2. SObject Fields
3. sObject RecordTypes
4. sObject Picklist values
5. sObject Type

Вступление

Рассмотрим в примерах способы получения метаданных с помощью Apex, которые будут содержать информацию о: Object Fields, sObject Type, RecordTypes of Object, Picklist values.

SObject Fields

Для получения полей объекта используется 3 способа. Для примера возьмём объект Account.

  1. В первом случае для получения полей объекта необходимость в классе Schema отсутствует.
Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.Account.fields.getMap();
  1. Тот же результат, но искомый объект указывается строкой.
Map<String,Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get('Account').getDescribe().fields.getMap();

  1. На случай если необходимо получить данные сразу по нескольким объектам.
Schema.DescribeSObjectResult[] descResult = Schema.describeSObjects(new String[]{'Account'});
Map<String,Schema.SObjectField> fieldMap = descResult[0].fields.getMap();

sObject RecordTypes

Для получения текущих RecordType на объекте используется.

Map<String, Schema.RecordTypeInfo> recordTypes = Account.SObjectType.getDescribe().getRecordTypeInfosByName();

Account.SobjectType.getDescribe().getRecordTypeInfos() - тоже даст ожидаемый результат.

sObject Picklist values

Получение значения для picklist поля Rating на объекте Account.

List<Schema.PicklistEntry> picklistValues = Account.Rating.getDescribe().getPicklistValues();

sObject Type

В ситуациях когда нужно определить тип объекта:

Возьмём для примера объект Account который возвратит SOQL запрос.

Account act=[SELECT Name 
             FROM Account 
             WHERE Name='AlexAccount' 
             LIMIT 1];

Добавим его в List

List<sObject> lst=new List<sObject>();
lst.add(act);

Теперь обращаясь листу, будет определён и получен необходимый объект.

if(lst[0].getSObjectType() == Schema.Account.getSObjectType()) {
    System.debug(lst[0].getSObjectType());
}
//Определение типа объекта по имени
if(lst[0].getSObjectType().getDescribe().getName() == 'Account') {
    System.debug(lst[0].getSObjectType().getDescribe().getName());
}
4 Likes

Спасибо за статью - про типы не знал.

1 Like