ship
SalesForce Simplified

Your Go-To Resource for Streamlined Solutions and Expert Guidance

mountains
Empower Your Business
Dive deep into the world of CRM excellence, where innovation meets practicality, and transform your Salesforce experience with Forceshark's comprehensive resources

Populating an Apex Map from a SOQL Query

Discover a simplified approach to populating Apex Maps directly from SOQL queries. This article provides a detailed explanation of how to construct efficient and optimized Map structures using SOQL results, enabling you to enhance your Apex code's performance and maintainability.

Populating a Map with Query Results

Using a Map to store query results in Salesforce Apex improves efficiency and retrieval speed. Instead of iterating through a list multiple times to find specific records, you can quickly access data using a key (e.g., Id). This is especially useful in triggers, batch processes, and controllers when handling large datasets.

Example Apex Class

Here's an example of querying Account records and storing them in a Map<Id, Account> for fast lookup:

public class AccountHelper {
    public static Map<Id, Account> getAccountMap(Set<Id> accountIds) {
        // Query accounts and store them in a map with Id as the key
        Map<Id, Account> accountMap = new Map<Id, Account>(
            [SELECT Id, Name, Industry FROM Account WHERE Id IN :accountIds]
        );
        return accountMap;
    }
}

This method can be called from triggers or other classes to efficiently retrieve Account records by their Id.

Mapping SOQL Query Results by More Than Just IDs

In Salesforce Apex, while mapping query results using record IDs is common, sometimes it's necessary to group data by other fields, such as names, emails, or external references.

Business Scenario

Consider a scenario where a company wants to quickly look up the Account industry based on its Name instead of the standard Id. This might be useful in integrations where external systems reference Accounts by name rather than by ID.

Apex Code Example

public class AccountIndustryMapper {
    public static Map<String, String> getAccountIndustryMap() {
        Map<String, String> accountMap = new Map<String, String>();

        for (Account acc : [SELECT Name, Industry FROM Account WHERE Industry != NULL]) {
            accountMap.put(acc.Name, acc.Industry); // May overwrite if duplicate names exist
        }

        return accountMap;
    }

    public static void logAccountIndustry(String accountName) {
        Map<String, String> accountMap = getAccountIndustryMap();

        if (accountMap.containsKey(accountName)) {
            System.debug('Industry for ' + accountName + ': ' + accountMap.get(accountName));
        } else {
            System.debug('No industry found for ' + accountName);
        }
    }
}

Next Step

This approach has a limitation: if multiple Accounts share the same name, the last one encountered in the loop will overwrite earlier ones. In the next section, we'll explore using a Map<String, List<String>> to handle multiple values per key.

When One Key Has Many Values

In some cases, a single key may correspond to multiple values. Using a simple Map<String, String> can lead to data loss if multiple records share the same key. Instead, we can use a Map<String, List<String>> to store multiple values under the same key.

Business Scenario

Consider a company that wants to track all Contacts associated with an Account by the Account Name. Since multiple Contacts can belong to the same Account, mapping them in a Map<String, List<String>> allows efficient lookups without losing data.

Apex Code Example

public class AccountContactsMapper {
    public static Map<String, List<String>> getAccountContactsMap() {
        Map<String, List<String>> accountContactsMap = new Map<String, List<String>>();

        for (Contact con : [SELECT Account.Name, Name FROM Contact WHERE AccountId != NULL]) {
            String accountName = con.Account.Name;

            if (!accountContactsMap.containsKey(accountName)) {
                accountContactsMap.put(accountName, new List<String>());
            }
            accountContactsMap.get(accountName).add(con.Name);
        }

        return accountContactsMap;
    }

    public static void logContactsByAccount(String accountName) {
        Map<String, List<String>> accountContactsMap = getAccountContactsMap();

        if (accountContactsMap.containsKey(accountName)) {
            System.debug('Contacts for ' + accountName + ': ' + accountContactsMap.get(accountName));
        } else {
            System.debug('No contacts found for ' + accountName);
        }
    }
}

Conclusion

Apex Maps provide a powerful way to store and retrieve data efficiently based on unique keys. By leveraging SOQL queries, developers can directly populate maps with data, simplifying data management and retrieval operations. This article has covered the basics of populating maps from SOQL queries, including handling multiple values for a single key and managing duplicate keys. By utilizing the techniques described, developers can streamline their code, improve performance, and enhance the effectiveness of their Apex applications.