Every business or application has search functionality as one of the basic requirements. For this, Salesforce.com provides two major approaches using SOSL and SOQL. Let us discuss the SOSL approach in detail in this chapter.
Searching the text string across the object and across the field will be done by using SOSL. This is Salesforce Object Search Language. It has the capability of searching a particular string across multiple objects.
SOSL statements evaluate to a list of sObjects, wherein, each list contains the search results for a particular sObject type. The result lists are always returned in the same order as they were specified in the SOSL query.
Consider a business case wherein, we need to develop a program which can search a specified string. Suppose, we need to search for string 'ABC' in the Customer Name field of Invoice object. The code goes as follows −
First, you have to create a single record in Invoice object with Customer name as 'ABC' so that we can get valid result when searched.
// Program To Search the given string in all Object // List to hold the returned results of sObject generic type List<list<SObject>> invoiceSearchList = new List<List<SObject>>(); // SOSL query which will search for 'ABC' string in Customer Name field of Invoice Object invoiceSearchList = [FIND 'ABC*' IN ALL FIELDS RETURNING APEX_Invoice_c (Id,APEX_Customer_r.Name)]; // Returned result will be printed System.debug('Search Result '+invoiceSearchList); // Now suppose, you would like to search string 'ABC' in two objects, // that is Invoice and Account. Then for this query goes like this: // Program To Search the given string in Invoice and Account object, // you could specify more objects if you want, create an Account with Name as ABC. // List to hold the returned results of sObject generic type List<List<SObject>> invoiceAndSearchList = new List<List<SObject>>(); // SOSL query which will search for 'ABC' string in Invoice and in Account object's fields invoiceAndSearchList = [FIND 'ABC*' IN ALL FIELDS RETURNING APEX_Invoice__c (Id,APEX_Customer__r.Name), Account]; // Returned result will be printed System.debug('Search Result '+invoiceAndSearchList); // This list will hold the returned results for Invoice Object APEX_Invoice__c [] searchedInvoice = ((List<APEX_Invoice_c>)invoiceAndSearchList[0]); // This list will hold the returned results for Account Object Account [] searchedAccount = ((List<Account>)invoiceAndSearchList[1]); System.debug('Value of searchedInvoice'+searchedInvoice+'Value of searchedAccount' + searchedAccount);
This is almost the same as SOQL. You can use this to fetch the object records from one object only at a time. You can write nested queries and also fetch the records from parent or child object on which you are querying now.
We will explore SOQL in the next chapter.