Salesforce
Language di query oggetto Salesforce (SOQL)
Ricerca…
Sintassi
- SELEZIONA ID dall'account
- SELEZIONA ID, Nome DA Account
- ID SELECT FROM Account WHERE Name = 'SomeAccountName'
- SELEZIONA Id, Nome, (ID SELEZIONA, Nome DA Contatti) DA Conto
- ID SELECT, Nome FROM Account WHERE Id =: apexVariableName
Query SOQL di base
SELECT Id, Name FROM Account
Ciò restituirà i campi Id e Nome dalla tabella Account. Non verranno applicati filtri o ordinamenti.
Query SOQL con filtraggio
SELECT Name FROM User WHERE IsActive = true
Questo restituirà il nome di tutti gli utenti attivi.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Ciò restituirà i contatti creati a partire dal 1 ° gennaio 2016.
SELECT Id, Name FROM Account LIMIT 100
Ciò restituirà i primi 100 account da un elenco non ordinato.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Ciò restituirà Lead con un numero di telefono corrispondente al formato specificato. "%" funge da carattere jolly.
L'utilizzo di LIKE '% %'
consente inoltre a uno sviluppatore di replicare una formula CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Restituirà Leads con una fonte principale che contiene Google, ad esempio "Google AdWords" e "Google Natural Search".
Query SOQL con ordine
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
Usare SOQL per costruire una mappa
Una caratteristica molto utile che molte persone trascurano è la capacità di costruire una mappa usando una query SOQL.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Quando si esegue questo codice, gli accounts
contengono una mappa degli oggetti Account, digitati su Id. L'output nel log di debug sarebbe simile a questo:
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},
...
}
Ora puoi cercare gli oggetti Account usando il loro ID. Inoltre, se si desidera una raccolta di ID univoci, è possibile chiamare la funzione keySet()
della classe Map, in questo modo:
System.debug(accounts.keySet());
che sembra qualcosa di simile nel registro di debug:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Questo è molto utile quando è necessario eseguire una query per ottenere i record e accedervi ripetutamente nel codice.
Query SOQL ai campi di riferimento dell'oggetto principale
Quando gli oggetti sono collegati da una relazione lookup o master-detail, i campi padre record possono essere referenziati dal record figlio o 'oggetto base' in una query. Questo è anche noto come attraversamento ascendente.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
È possibile attraversare cinque record verso l'alto.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Quando l'oggetto base è un campo di ricerca personalizzato, il nome __c nel campo Primary_Influencer__c, ad esempio, verrà modificato in __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
Query SOQL per ottenere record figlio
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Query SOQL in Apex
Per eseguire una query in Apex, racchiudi la query con parentesi quadre. Il risultato può essere assegnato a un elenco o a un singolo oggetto.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Riferimenti variabili in query SOQL Apex
Per fare riferimento a una variabile in una query, aggiungi i due punti (:) prima del nome della variabile.
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];
Possibili eccezioni nelle query SOQL Apex
Quando si assegna a un singolo oggetto, una query che restituisce qualcosa di diverso da una singola riga genererà una 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
}
Tentativo di utilizzare un campo che non hai incluso nella query genererà una 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
}
Utilizzando un semi-join
Selezione di tutti gli account con record di opportunità aperti sotto di essi
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
SOQL dinamico
È possibile eseguire una query di database da una stringa piuttosto che una normale espressione SOQL:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Poiché le query SOQL dinamiche non sono compilate, i loro riferimenti allo schema non sono convalidati, quindi è preferibile utilizzare l'interpolazione variabile Apex usando la sintassi :variable
ove possibile.