Apexでクエリ結果をMapに整理する最速の方法


【SOQLクエリ結果をApexのMapに変換する方法】

SOQLクエリの結果をMap<Id, SObject>形式で扱うことは可能です。直接的にはSOQLの実行結果はリストとして返されますが、簡単にMapに変換する方法があります。以下に解説します。


目的

  • キー: OpportunityのId
  • 値: 対応するOpportunityレコード

Mapへの変換方法

SOQLクエリの結果を直接Mapに変換する方法は、Map<Id, SObject>コンストラクタを使用することです。

コード例

// SOQLでレコードを取得
List<Opportunity> opportunities = [SELECT Id, OwnerId, Probability, Owner.Name 
                                    FROM Opportunity 
                                    WHERE LastModifiedDate = LAST_N_DAYS:7];

// ListをMapに変換
Map<Id, Opportunity> opportunityMap = new Map<Id, Opportunity>(opportunities);

// 確認: 特定のOpportunityをキーで取得
System.debug('Opportunity with specific Id: ' + opportunityMap.get('006XXXXXXXXXXXX'));

Mapに変換するメリット

  1. 高速なアクセス
    Mapを使用することで、キー(ここではOpportunity.Id)を使用して素早く特定のレコードにアクセスできます。
  2. クエリ結果の整理
    複数のOpportunityを扱う際に、IDをキーとして整理されるため可読性と操作性が向上します。

クエリ結果を直接Mapで取得できるか

SOQL自体はMap形式で結果を返しません。クエリ結果は常にList<SObject>として返されるため、Map形式にしたい場合は手動で変換する必要があります。


その他の方法:手動でMapを作成

Mapコンストラクタを使わず、手動でキーと値を指定してMapを作成する方法もあります。

コード例

// 手動でMapを作成
Map<Id, Opportunity> opportunityMap = new Map<Id, Opportunity>();

for (Opportunity opp : [SELECT Id, OwnerId, Probability, Owner.Name 
                         FROM Opportunity 
                         WHERE LastModifiedDate = LAST_N_DAYS:7]) {
    opportunityMap.put(opp.Id, opp);
}

// 確認
System.debug('Manual Map creation: ' + opportunityMap);

注意点

  1. データ量の制限
    SOQLクエリは最大50,000件のレコードを返しますが、Mapに多くのデータを格納するとメモリを消費します。
  2. キーのユニーク性
    Mapのキー(ここではId)はユニークでなければならないため、クエリ結果に同じIdが含まれる場合は注意が必要です。

コメント