Salesforce
Язык запросов Salesforce Object (SOQL)
Поиск…
Синтаксис
- SELECT Id FROM Account
- Идентификатор SELECT, имя FROM Account
- SELECT Id FROM Account WHERE Name = 'SomeAccountName'
- SELECT Id, Name, (SELECT Id, Name FROM Contacts) FROM Account
- SELECT Id, Name FROM Account WHERE Id =: apexVariableName
Основной запрос SOQL
SELECT Id, Name FROM Account
Это вернет поля Id и Name из таблицы Account. Никакая фильтрация или сортировка не будут применены.
Запрос SOQL с фильтрацией
SELECT Name FROM User WHERE IsActive = true
Это вернет имя всех активных пользователей.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Это вернет Контакты, созданные 1 января 2016 года или после этой даты.
SELECT Id, Name FROM Account LIMIT 100
Это вернет первые 100 учетных записей из неупорядоченного списка.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Это вернет Leads с номером телефона, соответствующим указанному формату. «%» действует как символ дикой карты.
Использование LIKE '% %'
также позволяет разработчику реплицировать формулу CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Вернет Leads с ведущим источником, который содержит Google, т.е. Google AdWords и Google Natural Search.
Запрос SOQL с заказом
SELECT Id, Name FROM User ORDER BY LastName
SELECT Id, Name FROM Contact ORDER BY LastModifiedDate DESC
SELECT Name, Title FROM User ORDER BY Title ASC NULLS FIRST
SELECT Id FROM Contact ORDER BY LastName ASC NULLS LAST, FirstName ASC NULLS FIRST
Использование SOQL для построения карты
Очень полезной особенностью, которую многие люди упускают, является возможность создания Карты с использованием SOQL-запроса.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Когда вы запускаете этот код, accounts
затем содержат карту объектов вашей учетной записи, с ключом на идентификаторе. Выход в журнал отладки будет выглядеть примерно так:
11:15:10:025 USER_DEBUG [13]|DEBUG|{
XXXXXXXXXXXXXXXXXX=Account:{Id=XXXXXXXXXXXXXXXXXX, Name=Account 1},
YYYYYYYYYYYYYYYYYY=Account:{Id=YYYYYYYYYYYYYYYYYY, Name=Account 2},
ZZZZZZZZZZZZZZZZZZ=Account:{Id=ZZZZZZZZZZZZZZZZZZ, Name=Account 3},
...
}
Теперь вы можете искать объекты учетной записи, используя свой идентификатор. Кроме того, если вам нужна коллекция уникальных идентификаторов, вы можете вызвать keySet()
класса Map, например:
System.debug(accounts.keySet());
который выглядит примерно так в журнале отладки:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Это очень полезно, когда вам нужно запросить, чтобы получать записи и получать их повторно в вашем коде.
SOQL-запрос к полям родительского объекта
Когда объект связан взаимосвязью lookup или master-detail, поле родительских записей может ссылаться на дочернюю запись или «базовый объект» в запросе. Это также известно как обход вверх.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Можно пройти пять записей вверх.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Когда базовый объект является настраиваемым полем поиска, имя __c в имени Primary_Influencer__c, например, будет изменено на __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
Запрос SOQL для получения дочерних записей
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Запросы SOQL в Apex
Для выполнения запроса в Apex окружайте запрос квадратными скобками. Результат может быть присвоен списку или одному объекту.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Переменные ссылки в Apex SOQL-запросах
Чтобы ссылаться на переменную в запросе, добавьте двоеточие (:) перед именем переменной.
Datetime targetDate = Datetime.now().addDays(-7);
List<Lead> recentLeads = [SELECT Id FROM Lead WHERE CreatedDate > :targetDate];
string targetName = 'Unknown';
List<Contact> incompleteContacts = [SELECT Id FROM Contact WHERE FirstName = :targetName];
Потенциальные исключения в запросах SOQL Apex
При назначении одному объекту запрос, возвращающий что-либо, кроме одной строки, QueryException
.
try {
Account a = [SELECT Id FROM Account WHERE Name = 'Non-existent Account'];
} catch (QueryException e) {
// List has no rows for assignment to SObject
}
try {
Account a = [SELECT Id FROM Account];
} catch (QueryException e) {
// List has more than 1 row for assignment to SObject
}
Попытка использовать поле, которое вы не включили в запрос, будет SObjectException
Account a = [SELECT Id FROM Account LIMIT 1];
try {
System.debug( a.Name );
} catch (SObjectException e) {
// SObject row was retrieved via SOQL without querying the requested field: Name
}
Использование Semi-Join
Выбор всех учетных записей, у которых есть открытые записи возможностей
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
Динамический SOQL
Вы можете выполнить запрос базы данных из строки, а не регулярного выражения SOQL:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Поскольку динамические запросы SOQL не компилируются, их ссылки на схемы не проверяются, поэтому предпочтительнее использовать интерполяцию переменных Apex, используя синтаксис :variable
где это возможно.