【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.