Zoeken…


Syntaxis

  • SELECT ID VAN Account
  • SELECT ID, Naam VAN Account
  • SELECTEER ID VAN Account WAAR Naam = 'SomeAccountName'
  • SELECT ID, Naam, (SELECT ID, Naam VAN Contacten) VAN Account
  • SELECT ID, Naam VAN Account WAAR Id =: apexVariableName

Basic SOQL-zoekopdracht

SELECT Id, Name FROM Account

Hiermee worden de velden Id en Naam uit de Account-tabel geretourneerd. Er wordt geen filter of sortering toegepast.

SOQL-zoekopdracht met filtering

SELECT Name FROM User WHERE IsActive = true

Dit retourneert de naam van alle actieve gebruikers.

SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z

Dit retourneert Contacten die zijn gemaakt op of na 1 januari 2016.

SELECT Id, Name FROM Account LIMIT 100

Hiermee worden de eerste 100 accounts van een ongeordende lijst geretourneerd.

SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'

Hiermee worden Leads geretourneerd met een telefoonnummer dat overeenkomt met het opgegeven formaat. "%" fungeert als een jokerteken.

Door LIKE '% %' gebruiken, kan een ontwikkelaar ook een CONTAINS( ) -formule repliceren.

SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'

Retourneert leads met een leadbron die Google bevat, bijvoorbeeld 'Google AdWords' en 'Google Natural Search'.

SOQL-aanvraag bij bestellen

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 gebruiken om een kaart te maken

Een zeer handige functie die veel mensen over het hoofd zien, is de mogelijkheid om een kaart te maken met behulp van een SOQL-zoekopdracht.

Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);

Wanneer u deze code uitvoert, bevat accounts vervolgens een kaart met uw accountobjecten, ingetoetst op id. De uitvoer naar het foutopsporingslogboek zou er ongeveer zo uitzien:

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}, 
    ...
}

U kunt nu de Account-objecten opzoeken met hun ID. Als u bovendien een verzameling unieke ID's wilt, kunt u de functie keySet() van de klasse Map als volgt aanroepen:

System.debug(accounts.keySet());

die er ongeveer zo uitziet in het logboek voor foutopsporing:

11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}

Dit is erg handig wanneer u moet zoeken om records te krijgen en ze herhaaldelijk in uw code te openen.

SOQL-vraag naar velden van bovenliggend object

Wanneer objecten worden gekoppeld door een opzoek- of hoofd-detailrelatie, kan naar de velden van de bovenliggende records worden verwezen vanuit het onderliggende record of 'basisobject' in een query. Dit wordt ook wel opwaartse doorgang genoemd.

SELECT FirstName, Account.Name, Account.Category__c FROM Contact

Het is mogelijk om vijf records omhoog te doorlopen.

SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact

Wanneer het basisobject een aangepast opzoekveld is, wordt de __c in de veldnaam Primary_Influencer__c bijvoorbeeld gewijzigd in __r.

SELECT Primary_Influencer__r.Nickname__c FROM Contact

SOQL Vraag om onderliggende records te krijgen

SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account

SOQL-zoekopdrachten in Apex

Om een query in Apex uit te voeren, omringt u de query met vierkante haken. Het resultaat kan worden toegewezen aan een lijst of aan een enkel object.

List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];

Variabele verwijzingen in Apex SOQL-zoekopdrachten

Als u naar een variabele in een query wilt verwijzen, voegt u een dubbele punt (:) toe vóór de naam van de variabele.

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];

Potentiële uitzonderingen in Apex SOQL-zoekopdrachten

Bij het toewijzen aan een enkel object, levert een query die iets anders dan een enkele rij QueryException een 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
}

Als u probeert een veld te gebruiken dat u niet in de query hebt opgenomen, wordt een 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 gebruiken

Alle accounts selecteren met open opportunityrecords eronder

SELECT Id, Name FROM Account WHERE AccountId IN 
    (SELECT Id FROM Opportunity WHERE IsClosed = false)

Dynamische SOQL

U kunt een databasequery uitvoeren vanuit een String in plaats van een reguliere SOQL-expressie:

String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);

Aangezien dynamische SOQL-query's niet zijn gecompileerd, zijn hun schemareferenties niet gevalideerd. Het verdient daarom de voorkeur om Apex variabele interpolatie te gebruiken met de :variable syntaxis waar mogelijk.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow