【Salesforce】Aggregate query does not support queryMore(), use LIMIT to restrict the results to a single batch

【Salesforce】Aggregate query does not support queryMore(), use LIMIT to restrict the results to a single batch

Salesforceでバッチ処理を使用する際、start()メソッドでクエリロケータを返します。

そのクエリロケータを返す処理で、エラーが発生しました。

Aggregate query does not support queryMore(), use LIMIT to restrict the results to a single batch

メッセージを呼んで分かるように、クエリロケータのコンストラクタへグループ化を使用するSOQLを設定しています。

バッチクラスのstart()メソッドのイメージとしてはこんな感じです。

global Database.QueryLocator start(Database.BatchableContext BC){

    String query;

    try{
        // group byを使用したSOQL
        query = ' ';
        query += ' select ';
        query += '     count(Id), ';
        query += '     ParentId';
        query += ' from ';
        query += '     Account ';
        query += ' where ';
        query += '     CreatedDate = THIS_MONTH ';
        query += ' group by ';
        query += '     ParentId ';

    }catch(Exception e){

        system.debug('【エラー】' + e.getMessage());
        system.debug('【エラー】' + e.getStackTraceString());
    }

    return Database.getQueryLocator(query);
}

がっつりと渡していますね。

リファレンスを読むと分かりますが、start()メソッドで返す値はクエリロケータでなくても良いのです。

Iterableなものであれば何でも良いわけですね。

https://trailhead.salesforce.com/ja/modules/asynchronous_apex/units/async_apex_batch

Iterableなものといえば、リストですよね。

こんな風に直すことが出来ます。

global List<SObject> start(Database.BatchableContext BC){

    String query;
    List<AggregateResult> resultList;

    try{
        // group byを使用したSOQL
        query = ' ';
        query += ' select ';
        query += '     count(Id), ';
        query += '     ParentId';
        query += ' from ';
        query += '     Account ';
        query += ' group by ';
        query += '     ParentId ';

        resultList = Database.query(query);

    }catch(Exception e){

        system.debug('【エラー】' + e.getMessage());
        system.debug('【エラー】' + e.getStackTraceString());
    }

    return resultList;
}

start()メソッド内でリストを取得し、そのまま返してしまいます。

Iterableなもので良ければ、自分で作ったクラスでも大丈夫なようです。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_iterable.htm

カスタムイテレータって作ったことないんですけどね。

No comments.

コメントを残す

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