我对 Apex 比较陌生,但我对正在创建的批处理作业有一些疑问。我想使用子查询进行查询(请参阅代码)。每个 Portal_c可以有超过 200 个Exporte_r 。
global Database.QueryLocator start(Database.BatchableContext BC) {
String query = 'SELECT Id, Name, (SELECT Id FROM Exporte__r) FROM Portal__c';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC, List<Portal__c> scope) {
for (Portal__c portal : scope) {
// doesn't work -> First error: Aggregate query has too many rows for direct assignment, use FOR loop
// when using FOR loop -> System.QueryException: invalid query locator
//List<Export__c> relatedExports = portal.Exporte__r;
// grab all the related Export__c records using 'getSObjects' to avoid errors described above
Export__c[] relatedExports = portal.getSObjects('Exporte__r');
if (relatedExports != null) {
for (Export__c exp : relatedExports) {
// do something
}
}
}
}
我有以下问题:
- 如果我使用
List<Export__c> relatedExports = portal.Exporte__r
(我注释掉)来获取子查询记录,那么我将收到错误消息:“聚合查询有太多行无法直接分配,请使用 FOR 循环”。该错误消息对我来说毫无意义,因为 SOQL 之前已经完成。有什么解释吗? - 使用上述解决方案,每个 Portal _c 接收到的类型 Exporte_ r 的最大记录数量为 199,尽管我对 Portal__c 的某些记录有 200 多条记录,为什么它仅限于该数量?在这种情况下,似乎所有高于 199 的记录都被忽略了。
- 是否有可能从子查询中接收超过 199 条记录?我试图更改批量大小,但它似乎与子查询可接收的记录数无关。任何想法?
非常感谢!