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