0

我对 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
                    }
              }
        }
}

我有以下问题:

  1. 如果我使用List<Export__c> relatedExports = portal.Exporte__r(我注释掉)来获取子查询记录,那么我将收到错误消息:“聚合查询有太多行无法直接分配,请使用 FOR 循环”。该错误消息对我来说毫无意义,因为 SOQL 之前已经完成。有什么解释吗?
  2. 使用上述解决方案,每个 Portal _c 接收到的类型 Exporte_ r 的最大记录数量为 199,尽管我对 Portal__c 的某些记录有 200 多条记录,为什么它仅限于该数量?在这种情况下,似乎所有高于 199 的记录都被忽略了。
  3. 是否有可能从子查询中接收超过 199 条记录?我试图更改批量大小,但它似乎与子查询可接收的记录数无关。任何想法?

非常感谢!

4

1 回答 1

0

根据销售人员文档http://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_loops_for_SOQL.htm

您可能会在 SOQLfor 循环中收到 QueryException,并显示消息 Aggregate query has too many rows for direct assignment, use FOR loop. 当访问循环内检索到的 sObject 的大量子记录时,或者在获取此类记录集的大小时,有时会引发此异常。为避免出现此异常,请使用 for 循环遍历子记录,如下所示。

Integer count=0;
for (Contact c : returnedAccount.Contacts) {
    count++;
    // Do some other processing
}
于 2013-09-18T08:45:23.520 回答