今日は、SOQLでのコレクション(List、Set、Map)とバインド変数に関する小技をご紹介。
○SetやMapでSOQLの結果を直接受け取る方法
SOQLの結果は通常Listで受け取りますが、↓のように、コンストラクタを使って、SetやMapで直接受け取ることができます。
// Listの場合
List<Account> accList = [Select Id From Account];
// Setの場合
// これはコンパイルエラー
Set<Account> accSet = [Select Id From Account];
// コンストラクタにSOQL結果のListを渡すとうまくいく
Set<Account> accSet
= new Set<Account>([Select Id From Account]);
// Mapの場合
// これはコンパイルエラー
Map<Id, Account> accMap = [Select Id From Account];
// コンストラクタにSOQL結果のListを渡すとうまくいく
Map<Id, Account> accMap
= new Map<Id, Account>([Select Id From Account]);
○IN句でコレクションを使用する方法
SOQLのIN句では、バインド変数にListとSetを使用できます。Mapは使用できませんが、Mapのvaluesメソッド または keySetメソッドで返すList または Setを渡すようにすると使用できます。
// Listの場合
List<String> nameList = new List<String>();
nameList.add('佐藤');
nameList.add('木村');
List<Contact> ctcList
= [Select Id From Contact Where LastName IN :nameList];
// Setの場合
Set<String> nameSet = new Set<String>();
nameSet.add('佐藤');
nameSet.add('木村');
List<Contact> ctcList
= [Select Id From Contact Where LastName IN :nameSet];
// Mapの場合
Map<String, String> nameMap = new Map<String, String>();
nameMap.put('佐藤', '佐藤');
nameMap.put('木村', '木村');
// これはコンパイルエラー
List<Contact> ctcList
= [Select Id From Contact Where LastName IN :nameMap];
// Mapの値セットを渡したい時は、valuesメソッドで返すListを渡すとうまくいく
List<Contact> ctcList
= [Select Id From Contact Where LastName IN :nameMap.values()];
// Mapのキーセットを渡したい時は、keySetメソッドで返すSetを渡すとうまくいく
List<Contact> ctcList
= [Select Id From Contact Where LastName IN :nameMap.keySet()];
○動的SOQLでバインド変数を使用する方法
[]内のSOQLの中でないと、バインド変数は使用できないと思われがちですが、動的SOQLでもバインド変数が使用可能です。
↓のように、Database.queryメソッドに渡すSOQL文字列にそのままバインド変数を記述すれば使用できます。
// 動的SOQLでもバインド変数が使えます
String soql = 'Select Id From Case Where Priority In :priorityList';
List<String> priorityList = new List<String>();
priorityList.add('高');
priorityList.add('中');
List<Case> caseList = Database.query(soql);