普通に知らなかったので備忘録として…。
BatchableなInterfaceを実装するApex Batchですがexecuteに入ってくるレコードは実在するSObjectじゃなくても良いし、そもそもSObjectである必要もなく、プリミティブやカスタムなApexClassも入れられちゃいます。
つまり、startの戻り値はDatabase.QueryLocatorではなくSytem.InterableなものもOK、ということです。(リファレンスに思いっきりstartメソッドが2つ定義されています)
ということでこんな感じなApex Batchでも全く問題ない、ということです。
public with sharing class HogeBatch implements Database.Batchable<Hoge> {
public Iterable<Hoge> start(Database.BatchableContext BC) {
return new List<Hoge> {
new Hoge('123'),
new Hoge('abc'),
new Hoge('123abc')
};
}
public void execute(Database.BatchableContext info, List<Hoge> hoges) {
for (Hoge hoge : hoges) {
System.debug(hoge.fuga);
}
}
public void finish(Database.BatchableContext info) {}
}
今まで既存レコードでしか利用できないと思っていました…とは言えQueryLocatorを使った既存レコードでの利用が8割以上な気がしますが。
利用ケースとしては
- レコードとして残さないけど、ガバナを要因として1トランザクション内で収まらない処理(コールアウトとかメール送信とか)
- 1トランザクションでのDML発行量のガバナを考慮してバッチで処理を分割したい