Apexバッチで使用するDatabase.getQueryLocator()。
特徴の1つとして、文字列でSOQLを作成し動的SOQLを実行できることが挙げられます。
ただ、Database.getQueryLocator()はインラインSOQLも使用できるとのことらしいので実際に試してみました。
【Apex】Database.query() とDatabase.getQueryLocator() の違いは?どう使い分ける?
今回は、Database.query() とDatabase.getQueryLocator() の違いと使い分けについてです。Visualforceのコントローラで動的SOQLを作成する際、Database.query() を使用していたのですが、そういえばApexバッチのときはDatabase.getQueryLocator() を使用していたなあと。
目次
文字列を使用した場合
まず、そもそもDatabase.getQueryLocator()で文字列SOQLを実行する場合ですが、以下コードの7行目のように文字列でSOQLを作成し、10行目でDatabase.getQueryLocator()の引数に文字列を渡して実行します。
public class AccountBatch implements Database.Batchable <sobject>, Database.Stateful{
public Database.QueryLocator start(Database.BatchableContext dbc){
system.debug('startメソッド');
//処理対象の取引先取得クエリ作成
String query = 'Select Id, Industry From Account Where Name Like \'取引先%\'';
//取引先を取得し、executeメソッドに渡す
return Database.getQueryLocator(query);
}
public void execute(Database.BatchableContext dbc, List<Account> accList){
system.debug('executeメソッド');
}
public void finish(Database.BatchableContext dbc){
system.debug('finishメソッド');
}
}
インラインSOQLを使用した場合
次にインラインSOQLを使用した場合ですが、以下コード7行目のようにDatabase.getQueryLocatorの引数に直接SOQLを書き込みます。
public class AccountBatch implements Database.Batchable <sobject>, Database.Stateful{
public Database.QueryLocator start(Database.BatchableContext dbc){
system.debug('startメソッド');
//取引先を取得し、executeメソッドに渡す
return Database.getQueryLocator([Select Id, Industry From Account Where Name Like '取引先%']);
}
public void execute(Database.BatchableContext dbc, List<Account> accList){
system.debug('executeメソッド');
}
public void finish(Database.BatchableContext dbc){
system.debug('finishメソッド');
}
}
特に変数を利用して動的SOQLにする必要がない場合は、Database.getQueryLocator()ではインラインSOQLを使っていこうと思います。
終わりです。
【Apex】分かる!分かるぞ!Apexバッチ処理【サンプルコードあり】
今回は「Apexバッチ処理」についてです。Apexバッチ処理を実装するメリットとして以下のようなことが挙げられます。大量データを扱ってもガバナ制限に引っかかりにくい…
コメント