MENU
Abo
某SIer勤務。
ITエンジニアです。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】Database.query() とDatabase.getQueryLocator() の違いは?どう使い分ける?

今回は、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() を使用する

また何かあれば追記していきます。

おわりです~

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
Salesforceエンジニアです。
日々の学びをつらつらと書いています。
Certified Administrator
Certified Platform DeveloperⅠ
Certified Platform DeveloperⅡ
Certified Sales Cloud Consultant

コメント

コメントする

CAPTCHA


目次