Salesforce
Langage de requête d'objet Salesforce (SOQL)
Recherche…
Syntaxe
- SELECT ID FROM Compte
- Identifiant SELECT, Nom du compte
- SELECT ID FROM Compte WHERE Name = 'SomeAccountName'
- SELECT ID, Nom, (ID SELECT, Nom FROM Contacts) FROM Compte
- SELECT ID, Nom FROM Compte WHERE Id =: apexVariableName
Requête SOQL de base
SELECT Id, Name FROM Account
Cela retournera les champs Id et Name de la table Account. Aucun filtrage ou tri ne sera appliqué.
Requête SOQL avec filtrage
SELECT Name FROM User WHERE IsActive = true
Cela renverra le nom de tous les utilisateurs actifs.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Cela renverra les contacts créés à partir du 1er janvier 2016.
SELECT Id, Name FROM Account LIMIT 100
Cela renverra les 100 premiers comptes d'une liste non ordonnée.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Cela renverra des pistes avec un numéro de téléphone correspondant au format spécifié. "%" agit comme un caractère générique.
L'utilisation de LIKE '% %'
permet également à un développeur de répliquer une formule CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Renvoie les prospects avec une source principale contenant Google, c'est-à-dire "Google AdWords" et "Google Natural Search".
Requête SOQL avec commande
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
Utiliser SOQL pour construire une carte
Une fonctionnalité très utile que beaucoup de gens ignorent est la possibilité de construire une carte en utilisant une requête SOQL.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Lorsque vous exécutez ce code, le accounts
contient alors une carte des objets de votre compte, indexés sur l'ID. La sortie du journal de débogage ressemblerait à ceci:
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},
...
}
Vous pouvez maintenant rechercher les objets Compte en utilisant leur identifiant. De plus, si vous voulez une collection d'ID uniques, vous pouvez appeler la fonction keySet()
de la classe Map, comme ceci:
System.debug(accounts.keySet());
qui ressemble à ceci dans le journal de débogage:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Ceci est très utile lorsque vous avez besoin d'interroger pour obtenir des enregistrements et d'y accéder de manière répétée dans votre code.
Requête SOQL pour référencer les champs de l'objet parent
Lorsque les objets sont liés par une relation de référence ou de référence, les champs des enregistrements parents peuvent être référencés à partir de l'enregistrement enfant ou de l'objet de base dans une requête. Ceci est également connu sous le nom de traversée vers le haut.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Il est possible de parcourir cinq enregistrements vers le haut.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Lorsque l'objet de base est un champ de recherche personnalisé, le nom du champ ___ dans Primary_Influencer__c, par exemple, sera remplacé par __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
Requête SOQL pour obtenir des enregistrements enfants
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Requêtes SOQL dans Apex
Pour effectuer une requête dans Apex, entourez la requête avec des crochets. Le résultat peut être affecté à une liste ou à un objet unique.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Références variables dans les requêtes SOQL Apex
Pour référencer une variable dans une requête, ajoutez un deux-points (:) avant le nom de la variable.
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];
Exceptions potentielles dans les requêtes SOQL Apex
Lors de l'attribution à un objet unique, une requête qui renvoie autre chose qu'une ligne unique QueryException
une 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
}
Tenter d'utiliser un champ que vous n'avez pas inclus dans la requête lancera une 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
}
Utiliser une semi-jointure
Sélection de tous les comptes qui ont des enregistrements d'opportunité ouverts sous eux
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
SOQL dynamique
Vous pouvez exécuter une requête de base de données à partir d'une chaîne plutôt qu'une expression SOQL standard:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Comme les requêtes SOQL dynamiques ne sont pas compilées, leurs références de schéma ne sont pas validées. Il est donc préférable d'utiliser l'interpolation de variables Apex en utilisant la syntaxe :variable
si possible.