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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow