📜  Apex-SOQL

📅  最后修改于: 2020-11-05 03:16:14             🧑  作者: Mango


这是旨在与SFDC数据库一起使用的Salesforce对象查询语言。它只能在单个sObject中根据给定条件搜索记录。

与SOSL一样,它不能跨多个对象搜索,但它确实支持嵌套查询。

SOQL示例

考虑我们正在进行的化学公司的例子。假设我们需要一个今天创建的记录列表,其客户名称不是“ test”。在这种情况下,我们将必须使用如下所示的SOQL查询-

// fetching the Records via SOQL
List InvoiceList = new List();
InvoiceList = [SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM
   APEX_Invoice__c WHERE createdDate = today AND APEX_Customer__r.Name != 'Test'];
// SOQL query for given criteria

// Printing the fetched records
System.debug('We have total '+InvoiceList.size()+' Records in List');

for (APEX_Invoice__c objInvoice: InvoiceList) {
   System.debug('Record Value is '+objInvoice); 
   // Printing the Record fetched
}

您可以通过开发者控制台中的查询编辑器运行SOQL查询,如下所示。

在开发人员控制台中运行下面给出的查询。搜索今天创建的发票记录。

SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c
   WHERE createdDate = today

您必须选择需要其值的字段,否则可能会引发运行时错误。

遍历关系字段

这是SFDC中最重要的部分之一,因为我们需要遍历父子对象关系的许多次

另外,在某些情况下,您需要在数据库中插入两个关联的对象记录。例如,发票对象与客户对象有关系,因此一个客户可以拥有许多发票。

假设您正在创建发票,然后需要将此发票与客户相关联。您可以将以下代码用于此功能-

// Now create the invoice record and relate it with the Customer object
// Before executing this, please create a Customer Records with Name 'Customer
// Creation Test'
APEX_Invoice__c objInvoice = new APEX_Invoice__c();

// Relating Invoice to customer via id field of Customer object
objInvoice.APEX_Customer__c = [SELECT id FROM APEX_Customer__c WHERE Name =
   'Customer Creation Test' LIMIT 1].id;
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice;  //Creating Invoice
System.debug('Newly Created Invoice'+objInvoice);  //Newly created invoice

在开发人员控制台中执行此代码段。执行后,从开发者控制台复制发票ID,然后在SFDC中打开发票ID,如下所示。您可以看到“父记录”已经分配给“发票记录”,如下所示。

提取父记录SOQL

提取儿童记录

现在让我们考虑一个示例,其中与特定客户记录相关的所有发票都必须放在一个位置。为此,您必须知道子关系名称。要查看子关系名称,请转到子对象上的字段详细信息页面,然后检查“子关系”值。在我们的示例中,末尾是__r附加的发票。

在此示例中,我们将需要设置数据,创建一个名称为“ ABC客户”记录的客户,然后向该客户添加3张发票。

现在,我们将获取客户“ ABC客户”的发票。以下是相同的查询-

// Fetching Child Records using SOQL
List ListCustomers = [SELECT Name, Id, 
   (SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];

// Query for fetching the Child records along with Parent
System.debug('ListCustomers '+ListCustomers); // Parent Record

List ListOfInvoices = ListCustomers[0].Invoices__r;
// By this notation, you could fetch the child records and save it in List
System.debug('ListOfInvoices values of Child '+ListOfInvoices);
// Child records

您可以在“调试”日志中看到“记录”值。

获取父记录

假设您需要获取创建日期为今天的发票客户名称,那么您可以使用下面给出的查询进行相同操作-

与子对象一起获取父记录的值。

// Fetching Parent Record Field value using SOQL
List ListOfInvoicesWithCustomerName = new List();
ListOfInvoicesWithCustomerName = [SELECT Name, id, APEX_Customer__r.Name 
   FROM APEX_Invoice__c LIMIT 10];

// Fetching the Parent record's values
for (APEX_Invoice__c objInv: ListOfInvoicesWithCustomerName) {
   System.debug('Invoice Customer Name is '+objInv.APEX_Customer__r.Name);
   // Will print the values, all the Customer Records will be printed
}

在这里,我们使用了符号APEX_Customer__r.Name,其中APEX_Customer__r是父关系名称,在这里您必须在父字段的末尾附加__r,然后才能获取父字段的值。

汇总功能

SOQL确实具有SQL中的聚合函数。汇总函数使我们可以汇总和汇总数据。现在让我们详细了解该函数。

假设您想知道我们从“ ABC客户”客户那里获得的平均收入是多少,那么您可以使用此函数来计算平均值。

// Getting Average of all the invoices for a Perticular Customer
AggregateResult[] groupedResults = [SELECT
   AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE
   APEX_Customer__r.Name = 'ABC Customer'];
Object avgPaidAmount = groupedResults[0].get('averageAmount');
System.debug('Total Average Amount Received From Customer ABC is '+avgPaidAmount);

检查调试日志中的输出。请注意,任何包含聚合函数的查询都将在AggregateResult对象数组中返回其结果。 AggregateResult是只读的sObject,仅用于查询结果。当我们需要生成有关大数据的报告时,这很有用。

您还可以使用其他聚合函数来执行数据汇总。

MIN() -可用于查找最小值

MAX() -可用于查找最大值。

绑定Apex变量

您可以在SOQL查询中使用Apex变量来获取所需的结果。 Apex变量可以用冒号(:)引用。

// Apex Variable Reference
String CustomerName = 'ABC Customer';
List ListCustomer = [SELECT Id, Name FROM APEX_Customer__c
   WHERE Name = :CustomerName];

// Query Using Apex variable
System.debug('ListCustomer Name'+ListCustomer); // Customer Name