SOQL クエリにバインド変数を使ってみる
学習の目的
この単元を完了すると、次のことができるようになります。
- SOQL クエリにバインド変数を動的に渡す。
SOQL クエリにバインド変数を動的に渡す
新しい Database.queryWithBinds
、Database.getQueryLocatorWithBinds
、Database.countQueryWithBinds
メソッドでは、クエリのバインド変数が Apex コード変数からではなく、Map パラメーターからキーを使用して直接解決されます。
この変更は、Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition の Lightning Experience および Salesforce Classic に適用されます。
この例では、SOQL クエリで取引先名のバインド変数が使用されています。値 (Acme Inc.
) は、nameBind
Map を使用してメソッドに渡されます。クエリがメソッド内で実行されるとき、accountName
変数はそのスコープ外です (スコープ内である必要はありません)。
public static List<Account> simpleBindingSoqlQuery(Map<String, Object> bindParams) { String queryString = 'SELECT Id, Name ' + 'FROM Account ' + 'WHERE name = :name'; return Database.queryWithBinds( queryString, bindParams, AccessLevel.USER_MODE ); } String accountName = 'Acme Inc.'; Map<String, Object> nameBind = new Map<String, Object>{'name' => accountName}; List<Account> accounts = simpleBindingSoqlQuery(nameBind); System.debug(accounts);
ハンズオン Challenge の準備をする
下記のハンズオン Challenge では、バインド変数を操作します。
ではここで新しい Trailhead Playground を作成し、このモジュールの手順を実行してみましょう。ページの最下部までスクロールし、Playground 名をクリックして、[Playground を作成] を選択します。Trailhead Playground が作成されるまで通常 3 ~ 4 分かかります。
ハンズオン Challenge に使用する組織を起動して、次の事前準備をします。
- Apex クラスを作成する
- 名前:
QueryContact
QueryContact
の内容を次のコードに置き換えます。
- 名前:
public class QueryContact { public static Id getContactID(String lastName, String title) { try { Contact myContact = Database.query( 'SELECT ID FROM Contact WHERE lastName = :lastName AND title = :title LIMIT 1' ); return myContact.Id; } catch (Exception ex) { return null; } } public static Id getContactIDWithBinds(Map<String, Object> bindVars) { //do not modify any code above this line //implement the logic that will use bindVars to retrieve the contact's ID return null; } }