- Apex编程教程
- Apex - 首页
- Apex - 概述
- Apex - 环境
- Apex - 示例
- Apex - 数据类型
- Apex - 变量
- Apex - 字符串
- Apex - 数组
- Apex - 常量
- Apex - 决策
- Apex - 循环
- Apex - 集合
- Apex - 类
- Apex - 方法
- Apex - 对象
- Apex - 接口
- Apex - DML
- Apex - 数据库方法
- Apex - SOSL
- Apex - SOQL
- Apex - 安全性
- Apex - 调用
- Apex - 触发器
- Apex - 触发器设计模式
- Apex - 限制
- Apex - 批处理
- Apex - 调试
- Apex - 测试
- Apex - 部署
- Apex有用资源
- Apex - 快速指南
- Apex - 资源
- Apex - 讨论
Apex - SOQL
这是Salesforce对象查询语言,旨在与SFDC数据库一起使用。它只能根据给定条件在一个sObject中搜索记录。
与SOSL类似,它无法跨多个对象搜索,但它支持嵌套查询。
SOQL示例
考虑我们正在进行的化工公司示例。假设我们需要一个今天创建且客户名称不为“test”的记录列表。在这种情况下,我们将必须使用如下所示的SOQL查询:
// fetching the Records via SOQL List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>(); 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中打开它,如下所示。您可以看到父记录已分配给发票记录,如下所示。
获取子记录
现在让我们考虑一个示例,其中所有与特定客户记录相关的发票都需要在一个地方。为此,您必须知道子关系名称。要查看子关系名称,请转到子对象上的字段详细信息页面并检查“子关系”值。在我们的示例中,它是在末尾附加了__r的发票。
示例
在此示例中,我们需要设置数据,创建一个名为“ABC Customer”的客户记录,然后向该客户添加3张发票。
现在,我们将获取客户“ABC Customer”拥有的发票。以下是相应的查询:
// Fetching Child Records using SOQL List<apex_customer__c> 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<apex_invoice__c> 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<apex_invoice__c> ListOfInvoicesWithCustomerName = new List<apex_invoice__c>(); 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 Customer”那里获得的平均收入是多少,那么您可以使用此函数来计算平均值。
示例
// 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<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c WHERE Name = :CustomerName]; // Query Using Apex variable System.debug('ListCustomer Name'+ListCustomer); // Customer Name