SOQL是為了使用SFDC數(shù)據(jù)庫設(shè)計的 Salesforce 對象查詢語言。它可以在單個sObject中在給定標(biāo)準(zhǔn)上搜索記錄。
像SOSL一樣,它不能搜索多個對象,但它支持嵌套查詢。
想想我們正在進行的化學(xué)公司的例子。 假設(shè),我們想有一個今天創(chuàng)建的記錄列表,其客戶名稱不是'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 }您可以通過開發(fā)人員控制臺中的查詢編輯器運行SOQL查詢,如下所示。
在開發(fā)人員控制臺中運行以下查詢。 搜索今天創(chuàng)建的發(fā)票記錄。
SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c WHERE createdDate = today
您必須選擇要為其設(shè)置值的字段,否則可能會導(dǎo)致運行時錯誤。
假設(shè)您正在創(chuàng)建發(fā)票,然后您想將此發(fā)票與客戶相關(guān)聯(lián)。 您可以使用以下代碼實現(xiàn)此功能:
//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 creted invoice
在開發(fā)者控制臺中執(zhí)行此代碼段。 執(zhí)行后,從開發(fā)人員控制臺復(fù)制發(fā)票的Id,然后在SFDC中打開它,如下所示。 您可以看到父記錄已分配給發(fā)票記錄,如下所示。
讓我們舉一個例子,我們希望所有的發(fā)票與特定的客戶記錄相關(guān)。 為此,您必須知道子關(guān)系名稱。 要查看子關(guān)系名稱,請轉(zhuǎn)到子對象的字段詳細信息頁面,并檢查“子關(guān)系”值。 在我們的示例中,它是由__r在末尾附加的發(fā)票。
例如:
首先,我們需要設(shè)置數(shù)據(jù),創(chuàng)建一個名為“ABC客戶”記錄的客戶,然后向該客戶添加3張發(fā)票。現(xiàn)在,我們想獲取客戶的ABC客戶有多少張發(fā)票。 下面是同樣的查詢:
//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 Childs '+ListOfInvoices);//Child records
您可以在Debug日志中看到記錄值。
假設(shè)您要獲取創(chuàng)建日期為今天的發(fā)票的客戶名稱,那么您可以使用以下查詢:
例如:獲取父記錄的值以及子對象。
//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是父關(guān)系名,這里你必須在Parent字段的末尾附加__r,然后你可以獲取父字段值。
SOQL具有我們在SQL中的聚合函數(shù)。 聚合函數(shù)允許我們匯總和匯總數(shù)據(jù)。 讓我們看一下細節(jié)。
例如:
//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);
檢查調(diào)試日志中的輸出。 請注意,包含聚合函數(shù)的任何查詢都會在AggregateResult對象數(shù)組中返回其結(jié)果。 AggregateResult是一個只讀的sObject,只用于查詢結(jié)果。 當(dāng)我們想生成大數(shù)據(jù)報告時,這很有用。
還有其他的聚集函數(shù),你可以用它來進行數(shù)據(jù)匯總。
MIN() -此可以用來找到最小值
MAX() -此可以用來找出最大值。
您可以在SOQL查詢中使用Apex變量來獲取所需的結(jié)果。 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
更多建議: