Skip to main content

SF Fact #02 | Database.querywithBinds() usage

 


Dynamic SOQL refers to constructing a SOQL query string at runtime using Apex code. This approach allows for more flexible applications. For example, you can create a search based on user input or update records with different field names.

Creating Dynamic SOQL Queries To create a dynamic SOQL query at runtime, use the Database.query or Database.queryWithBinds methods in the following ways:

Single Record Query:

sObject s = Database.query(string);

Multiple Records Query:

List<sObject> sobjList = Database.query(string);

Query with Bind Variables:

List<sObject> sobjList = Database.queryWithBinds(string, bindVariablesMap, accessLevel);

These methods can be used wherever inline SOQL queries are used, such as in assignment statements and for loops, and are processed similarly to static SOQL queries.

API Version 55.0 and Later: User Mode for Database Operations With API version 55.0 and later, the accessLevel parameter allows running the query in user or system mode:

  • System Mode (Default): Ignores object and field-level permissions of the current user, with record sharing rules controlled by class sharing keywords.
  • User Mode: Enforces object permissions, field-level security, and sharing rules of the current user.

  • Type Safety in Dynamic SOQL Dynamic SOQL results can be specified as specific sObjects (e.g., Account or MyCustomObject__c) or the generic sObject type. At runtime, Salesforce validates the query result type against the declared variable type, throwing an error if they don't match. This ensures you don't need to cast from a generic sObject to a specific type.

    Dynamic SOQL Considerations

    Using Bind Variables:

    String myTestString = 'TestName'; List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE Name = :myTestString');

    Unlike inline SOQL, you can't use bind variable fields directly in Database.query:

    MyCustomObject__c myVariable = new MyCustomObject__c(field1__c ='TestField'); List<sObject> sobjList = Database.query('SELECT Id FROM MyCustomObject__c WHERE field1__c = :myVariable.field1__c'); // Not supported

    API Version 57.0 and Later: Use Database.queryWithBinds to pass bind variables directly from a map:

    Map<String, Object> acctBinds = new Map<String, Object>{'acctName' => 'Acme Corporation'}; List<Account> accts = Database.queryWithBinds('SELECT Id FROM Account WHERE Name = :acctName', acctBinds, AccessLevel.USER_MODE);

    Map Parameter Considerations:

    • Map keys are case-sensitive but queryWithBinds treats them case-insensitively, throwing an error if duplicates exist.
    • Map keys must adhere to naming standards and avoid reserved keywords.
    • Avoid using dot notation with map keys.
    Preventing SOQL Injection To prevent SOQL injection, use the escapeSingleQuotes method to sanitize user input:

    String safeInput = String.escapeSingleQuotes(userInput);

    Additional Dynamic SOQL Methods

    • Database.countQuery and Database.countQueryWithBinds: Return the number of records a dynamic SOQL query would return.
    • Database.getQueryLocator and Database.getQueryLocatorWithBinds: Create a QueryLocator object for batch Apex or Visualforce.

    Comments

    Popular Posts

    Top 100 Most common used Apex Method in Salesforce

      Here are 100 more Apex methods in Salesforce: 1.       insert: Inserts records into the database. 2.       update: Updates records in the database. 3.       delete: Deletes records from the database. 4.       upsert: Updates or inserts records into the database. 5.       query: Retrieves records from the database using SOQL. 6.       getContent: Retrieves the content of a document or attachment. 7.       getContentAsPDF: Generates a PDF file from a Visualforce page or HTML content. 8.       addError: Adds a custom error message to a record and prevents saving. 9.       start: Initiates processing in batch Apex. 10.    execute: Processes a batch of records in batch Apex. 11.    finish: Finalizes processing in batch Apex....

    How to create ICS/Calendar File | Helps you to download the calendar invites

      Want to know how to create ICS(Internet Calendar Scheduling) file for Business purpose....👀    ICS (Internet Calendar Scheduling) file is a calendar file saved in a universal calendar format used by several email and calendar programs, including Microsoft Outlook, Google Calendar, Notes and Apple Calendar. It enables users to publish and share calendar information on the web and over email. Lets see the code. The code is written in lwc(Lightning web component). HTML:   <template> <div class="login-container"> <h1 style="size: 14px;"><b>Create ICS File</b></h1> <div class="form-group"> <lightning-input type="datetime" name="input1" value={EventEndValue} onchange={startDate} label="Enter Start date/time value" ></lightning-input> </div> <div class="form-group"> <lightning-input type="...

    Sharing records by Apex in Salesforce

      Greetings, everyone! In today's session, we'll delve into the topic of sharing records within an Apex class. As we're aware, there exist various methods through which we can accomplish the sharing of records. We engage in record sharing primarily when the object's Organization Wide Default (OWD) settings are set to private. Sharing settings come into play when certain predefined criteria are met, allowing us to extend access to records to designated groups or roles. In cases where intricate logic is involved, manual sharing is employed. While this approach proves beneficial for specific records, instances where a multitude of records require automated handling, Apex sharing becomes the preferred solution. Salesforce offers a 'Share' object for each type of object, with distinct naming conventions: For standard objects, it's 'StandardobjectName+Share', such as 'AccountShare' for the 'Account' object. Custom objects follow the pattern...

    Login Salesforce Without Credentials(Without UserName and Password)

      Want to login into Salesforce without credentials. Please follow the below STEPS: STEPS:-  1)  Goto to setup  --> Open Developer Console. 2) Goto debug --> Open Execute Anonymous Window --> It will open the pop. 3) Please write the below code in Anonymous window.       String sessionId = UserInfo.getOrganizationId() + '' + UserInfo.getSessionId().SubString(15);      System.debug('$$$$ Session Id ' + sessionId); 4) Click on Execute and filter the debug. You can see one session Id with Organization Id. Now, we have to copy the debug session Id and create one login URL. Steps to create Login URL: 1) Copy the Salesforce URL. Please refer the screenshot shown below. 2) Now concatenate the session Id with the salesforce URL and your Session Id Will look like below. https://d5g000004zfq2eai-dev-ed.lightning.force.com/secur/frontdoor.jsp?sid=00D5g000004zfQ2EAI!AQgAQKzTcnQTifXpRnQ7DgECtk_rv.w9BT5FoPEAmoy_UrgG4HJ6B9YFpQ2LVlmnJhBrYPSf8cI...

    SF Fact #03 | Undelete Failed, Entity is not in recycle bin

      Similar to ENTITY_IS_DELETED error, if we attempt to undelete a record from recycle bin by mistake which has already been hard deleted, the following error is encountered: UNDELETE_FAILED. When a record is deleted, it moves to the Recycle Bin. This is known as "soft deletion," allowing the record to be easily restored through the user interface. However, under certain conditions, a deleted record will no longer appear in the Recycle Bin: Master-Detail Relationship (Child Deleted First): If a record is a child or detail in a master-detail relationship and it is deleted before its parent record, then after the parent is deleted, the child record transitions to a "hard deleted" status. In this state, the child record cannot be recovered through the Recycle Bin and must be recreated if needed. Master-Detail Relationship (Parent Deleted): If a record is a child or detail in a master-detail relationship and the parent record is deleted, the child record is also soft del...