Data Cloud In Apex

You can use Apex with Data Cloud objects, with constraints and considerations that are detailed in this topic . Further, you can mock SOQL query responses for Data Cloud data model objects (DMOs) in Apex testing by using SOQL stub methods and a test class.

Using SOQL in Apex with Data Cloud Objects

Static SOQL is supported with Data Cloud data model objects (DMOs) as a more direct alternative to using either dynamic SOQL or ConnectAPI. Additionally, SOQL queries against DMOs using Apex Database.QueryLocator or in FOR loops is supported in API version 61.0 and later. In versions earlier than 61.0, only the first 201 records are returned. Batch Apex is blocked against DMOs when using QueryLocators, but is supported when using Iterable.

Running SOQL queries against DMOs can result in Data Services credits being consumed from your Data Cloud subscription. For more information on how usage is billed, see Data Cloud Billable Usage Types. Use caution when using FOR loops, query locators, recursion, or any mechanism that can result in multiple queries to Data Cloud.

Warning

A static SOQL query against Data Cloud from Apex is considered a callout and is subject to the same restrictions as HTTP callouts from Apex. For example, if there is pending DML, this sample code can result in an unexpected exception with this message: UnexpectedException: A callout was unsuccessful because of pending uncommitted work related to a process, flow, or Apex operation. Commit or roll back the work, and then try again.

1insert new Account(Name='Test');
2List<ssot_Account_dlm> dmo1 = [Select Id from ssot_Account_dlm];
3

Security Considerations

You must consider field- and record-level access when using Apex with Data Cloud data model objects (DMOs). DMOs in all data spaces are accessible from Apex in system mode, even when a permission set for the data space isn’t explicitly assigned. Read-only object-level access checks are supported if the user has access to the data space. There’s currently no support for field-level security or for record-level access control. Apex features, such as WITH USER_MODE, WITH SECURITY_ENFORCED, describe calls, and  Security.stripInaccessible(), can check only object-level access for DMOs.

Starting with API version 61.0, you can get information on a specific DMO using SObjectType.getDescribe(). There’s no field-level security to be enforced because all fields on DMOs that are accessed by field describes and security model checks are read only. You can’t use Schema.getGlobalDescribe() to discover exposed DMOs. Instead, use the Schema.describeSObjects(List<String>) method with the known DMO API names.

This example uses static SOQL with the UnifiedIndividual__dlm Data Cloud object.

1//Static SOQL example
2List<UnifiedIndividual__dlm> unifiedIndividuals = [
3      SELECT
4        Id,
5        ssot__FirstName__c,
6        ssot__LastName__c,
7        ssot__Email__c,
8        ssot__SkyMilesBalance__c,
9        ssot__MedallionStatus__c
10      FROM UnifiedIndividual__dlm
11      WHERE ssot__CompanyId__c = :companyId
12    ];
13
14