今回は、Database.query() とDatabase.getQueryLocator() の違いと使い分けについてです。
Visualforceのコントローラで動的SOQLを作成する際、Database.query() を使用していたのですが、そういえばApexバッチのときはDatabase.getQueryLocator() を使用していたなあと。
この2つ、いったい何が違うのか、、
Database.query()
Database.query()の特徴として、以下のような点が挙げられます。
- 動的SOQLを作成できる
- 最大50,000件のレコードを取得可能
- Apexバッチでも50,000件
レコードの最大取得数は50,000件で、Apexバッチで使用してもその数に変わりはありません。
以下のように文字列としてSOQLを作成し、変数を組み合わせることで動的にレコードを取得することが可能です。
String accName = '取引先';
String query = 'SELECT Id FROM Account';
query += ' WHERE Name LIKE \'%' + accName + '%\'';
List<Account> accList = Database.query(query);
Database.getQueryLocator()
Database.getQueryLocator() の特徴として、以下のような点が挙げられます。
- 動的SOQLを作成できる
- 最大10,000件のレコードを取得可能
- Apexバッチでは最大5,000万件
- Apexバッチでは取得結果をstartメソッドの引数として渡せる
Database.getQueryLocator() もDatabase.query()と同じく動的SOQLを作成できます。
レコード取得件数は最大10,000件と少ないものの、バッチ内で使用すると最大5,000万件取得することができます。
ただ、1回でまとめて取得するのではなく、指定したバッチサイズの件数ごとに取得してそれを繰り返し処理するという流れになります。
以下のソースコードはApexバッチのコードを抜粋したものです。
7行目でSOQLクエリを作成し、10行目でDatabase.getQueryLocator()を使用してレコードを取得し、executeメソッドの引数に取得結果を渡しています。
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メソッド');
}
}
Apexバッチについては以下の記事に詳しく記載していますのでよかったら参考にしてみてください。
まとめ
visualforceのread only属性がtrueの時は、Database.getQueryLocator() を使用するという情報も目に付いたのですが、その利点をいまいち理解できておらず、とりあえず以下のようにまとめておくことにします、、、
- 基本的には取得件数が多いDatabase.query()を使用する
- ApexバッチではDatabase.getQueryLocator() を使用する
また何かあれば追記していきます。
おわりです~
コメント