Salesforce
Salesforce Object Query Language (SOQL)
Szukaj…
Składnia
- WYBIERZ Id z konta
- WYBIERZ Identyfikator, nazwa z konta
- WYBIERZ ID Z konta GDZIE Nazwa = 'SomeAccountName'
- WYBIERZ Id, Nazwa, (WYBÓR Id, Imię Z Kontaktów) Z konta
- WYBIERZ Id, Nazwa Z Konta GDZIE Id =: apexVariableName
Podstawowe zapytanie SOQL
SELECT Id, Name FROM Account
Spowoduje to zwrócenie pól Id i Nazwa z tabeli Konta. Nie będzie stosowane żadne filtrowanie ani sortowanie.
Zapytanie SOQL z filtrowaniem
SELECT Name FROM User WHERE IsActive = true
Spowoduje to zwrócenie nazwy wszystkich aktywnych użytkowników.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Spowoduje to zwrócenie Kontaktów utworzonych 1 stycznia 2016 r. Lub później.
SELECT Id, Name FROM Account LIMIT 100
Spowoduje to zwrócenie pierwszych 100 kont z nieuporządkowanej listy.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Zwróci to odprowadzenie z numerem telefonu pasującym do określonego formatu. „%” działa jak postać wieloznaczna.
Użycie LIKE '% %'
umożliwia także programistom replikację formuły CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Zwróci Leady ze źródłem ołowiu zawierającym Google, tj. „Google AdWords” i „Google Natural Search”.
Zapytanie SOQL z zamówieniem
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
Używanie SOQL do budowy mapy
Bardzo przydatną funkcją, którą wielu ludzi przeoczy, jest możliwość zbudowania mapy za pomocą zapytania SOQL.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Po uruchomieniu tego kodu accounts
zawierają mapę obiektów konta wpisaną w Id. Dane wyjściowe do dziennika debugowania wyglądałyby podobnie do tego:
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},
...
}
Możesz teraz wyszukiwać obiekty konta przy użyciu ich identyfikatora. Ponadto, jeśli chcesz mieć kolekcję unikalnych identyfikatorów, możesz wywołać funkcję keySet()
klasy Map, na przykład:
System.debug(accounts.keySet());
który wygląda mniej więcej tak w dzienniku debugowania:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Jest to bardzo przydatne, gdy trzeba wykonać zapytanie, aby uzyskać rekordy i uzyskać do nich dostęp wielokrotnie w kodzie.
Zapytanie SOQL do odwołania do pól obiektu nadrzędnego
Gdy obiekty są połączone przez wyszukiwanie lub relację wzorca-szczegółów, do pola rekordów nadrzędnych można odwoływać się z rekordu podrzędnego lub „obiektu podstawowego” w zapytaniu. Jest to również znane jako przejście w górę.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Możliwe jest przejście o pięć rekordów w górę.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Gdy obiektem podstawowym jest niestandardowe pole wyszukiwania, na przykład __c w nazwie pola Primary_Influencer__c zostanie na przykład zmienione na __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
Zapytanie SOQL, aby uzyskać rekordy potomne
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Zapytania SOQL w apeksie
Aby wykonać zapytanie w wierzchołku, otocz je nawiasami kwadratowymi. Wynik można przypisać do listy lub do pojedynczego obiektu.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Odwołania do zmiennych w zapytaniach Apex SOQL
Aby odwołać się do zmiennej w zapytaniu, dodaj dwukropek (:) przed nazwą zmiennej.
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];
Potencjalne wyjątki w zapytaniach Apex SOQL
Podczas przypisywania do pojedynczego obiektu zapytanie zwracające cokolwiek innego niż pojedynczy wiersz spowoduje 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
}
Próba użycia pola, którego nie uwzględniono w zapytaniu spowoduje 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
}
Korzystanie z połączenia częściowego
Wybieranie wszystkich kont, które mają otwarte rekordy możliwości pod nimi
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
Dynamiczny SOQL
Możesz wykonać zapytanie do bazy danych na podstawie ciągu znaków zamiast zwykłego wyrażenia SOQL:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Ponieważ dynamiczne zapytania SOQL nie są kompilowane, ich odwołania do schematów nie są sprawdzane, dlatego lepiej jest używać interpolacji zmiennych Apex przy użyciu, gdzie to możliwe, składni :variable
.