« Salesforce for Social Mediaを使ってみよう | メイン | Visualforce Chartingの利用方法 »

2011年11月21日 (月)

SOQLでのコレクションとバインド変数の使用方法

今日は、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);

コメント

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上
でのWebアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

  • 株式会社フレクトは、
      ・認定コンサルタント
      ・認定上級デベロッパー
      ・認定デベロッパー
    が在籍している、セールスフォースパートナーです。
    また、heroku partnersにも登録されています。
    herokuパートナー
    株式会社フレクト
    Salesforce/Force.com
    導入支援サービス
    弊社の認定プロフェッショナルが支援致します。
    ・Visualforce/Apexによるアプリ開発
    ・Salesforceと連携するWebアプリ開発
    も承っております。
    セールスフォースご検討の際は、
    お気軽にお問合せください。

Twitter

リファレンス

■Developer's Guide(リファレンス)
・Apex  HTML | PDF | 日本語PDF | ガバナ制限
・Visualforce  HTML | PDF
・Web Services API  HTML | PDF | 日本語PDF
・Bulk API  HTML | PDF
・REST API  HTML | PDF | 日本語PDF
・Metadata API  HTML | PDF
・Migration Tool  HTML | PDF
・AJAX Toolkit  HTML | PDF
・Data Loader PDF | 日本語PDF

■早見表 (日本語)
数式
Apex
Visualforce
Web Services API
Chatter