Salesforce
Lenguaje de consulta de objetos de Salesforce (SOQL)
Buscar..
Sintaxis
- SELECCIONAR ID DE Cuenta
- SELECCIONAR ID, Nombre DESDE cuenta
- SELECCIONE ID DE LA Cuenta DONDE Nombre = 'SomeAccountName'
- SELECCIONE ID, Nombre, (SELECCIONE ID, Nombre DE Contactos) DESDE Cuenta
- SELECCIONE ID, nombre DESDE la cuenta DONDE Id =: apexVariableName
Consulta SOQL básica
SELECT Id, Name FROM Account
Esto devolverá los campos Id y Nombre de la tabla de la Cuenta. No se aplicará ningún filtrado o clasificación.
Consulta SOQL Con Filtrado
SELECT Name FROM User WHERE IsActive = true
Esto devolverá el nombre de todos los usuarios activos.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Esto devolverá los contactos creados el 1 de enero de 2016 o después.
SELECT Id, Name FROM Account LIMIT 100
Esto devolverá las primeras 100 cuentas de una lista no ordenada.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Esto devolverá Leads con un número de teléfono que coincida con el formato especificado. "%" actúa como un carácter comodín.
Usar LIKE '% %'
también permite que un desarrollador replique una fórmula CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Devolverá los prospectos con una fuente principal que contenga Google, es decir, "AdWords de Google" y "Búsqueda natural de Google".
Consulta de SOQL con pedidos
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
Usando SOQL para construir un mapa
Una característica muy útil que muchas personas pasan por alto es la capacidad de construir un mapa usando una consulta SOQL.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Cuando ejecuta este código, las accounts
contienen un mapa de los objetos de su cuenta, con la clave de identificación. La salida al registro de depuración se vería similar a esto:
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},
...
}
Ahora puede buscar los objetos de la Cuenta utilizando su Id. Además, si desea una colección de ID únicas, puede llamar a la función keySet()
de la clase Map, así:
System.debug(accounts.keySet());
que se ve algo como esto en el registro de depuración:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Esto es muy útil cuando necesita consultar para obtener registros y acceder a ellos repetidamente en su código.
Consulta de SOQL para hacer referencia a los campos del objeto principal
Cuando los objetos están vinculados por una relación de búsqueda o detalle maestro, los campos de registros primarios pueden ser referenciados desde el registro secundario o "objeto base" en una consulta. Esto también se conoce como travesía hacia arriba.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Es posible recorrer cinco récords hacia arriba.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Cuando el objeto base es un campo de búsqueda personalizado, el __c en el nombre del campo Primary_Influencer__c, por ejemplo, se cambiará a __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
Consulta SOQL para obtener registros hijo
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Consultas SOQL en Apex
Para realizar una consulta en Apex, rodee la consulta entre corchetes. El resultado se puede asignar a una lista, o a un solo objeto.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Referencias de variables en las consultas de Apex SOQL
Para hacer referencia a una variable en una consulta, agregue dos puntos (:) antes del nombre 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];
Posibles excepciones en las consultas de Apex SOQL
Cuando se asigna a un solo objeto, una consulta que devuelve algo que no sea una sola fila arrojará 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
}
Si intenta utilizar un campo que no incluyó en la consulta, se emitirá 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
}
Usando un Semi-Join
Seleccionar todas las cuentas que tienen registros de oportunidades abiertas debajo de ellas
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
SOQL dinámico
Puede ejecutar una consulta de base de datos desde una cadena en lugar de una expresión SOQL regular:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Dado que las consultas dinámicas de SOQL no se compilan, sus referencias de esquema no se validan, por lo que es preferible utilizar la interpolación de variables de Apex utilizando la sintaxis :variable
cuando sea posible.