我对 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 之前已经完成了。有解释吗?非常感谢!
根据 salesforce 文档 http://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_loops_for_SOQL.htm
您可能会在 SOQLfor 循环中收到 QueryException 并显示以下消息 聚合查询的行数过多,无法直接赋值,请使用FOR循环。 访问大量子项时有时会抛出此异常 循环内或获取 sObject 时检索到的 sObject 的记录 此类记录集的大小。为了避免出现此异常,请使用 for 循环迭代子记录,如下所示。
Integer count=0; for (Contact c : returnedAccount.Contacts) { count++; // Do some other processing }
您不应在批次查询定位器的查询中使用内部查询。将开始查询更改为此
global Database.QueryLocator start(Database.BatchableContext BC) {
String query = 'SELECT Id, Name FROM Portal__c';
return Database.getQueryLocator(query);
}
然后在execute中查询需要的Exporte__r记录。在此查询中,请记住设置限制等,否则您将再次收到“太多 DML 行”错误。