【Salesforce】クエリロケータの書き方について

【Salesforce】クエリロケータの書き方について

バッチ処理のStartメソッドで返さなければいけない、Database.QueryLocatorというものがあります。

Database.getQueryLocatorで取得することが出来るのですが、その引数は2種類あります。

SOQLの文字列を渡すものと、SObjectのリストを渡すものです。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_database.htm#apex_methods_system_database

SOQLの文字列を渡す場合は特に問題ないのですが、SObjectのリストを渡す場合は少し注意が必要なようです。

例えば、このようなコードを書いた場合です。

List<Account> accountList;
Database.QueryLocator locator;

// 取引先のリストを取得する
accountList = [select Id from Account];
// クエリロケータを作成する
locator = Database.getQueryLocator(accountList);  // Argument must be an inline query.

一見大丈夫そうに見えるのですが、保存時にエラーが発生します。

Argument must be an inline query.

引数はインラインのクエリで、とのことです。

つまり

Database.QueryLocator locator;

// クエリロケータを作成する
locator = Database.getQueryLocator(
    [select Id from Account]
);

これであればエラー無く通ります。

訳あって1つのバッチクラスで複数のクエリロケータを使い分ける必要がありましたが、これで解決できました。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です