批处理作业:子查询可接收的记录数

问题描述 投票:0回答:2

我对 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 条记录?我尝试更改批量大小,但似乎它与子查询可接收的记录数无关。有什么想法吗?

非常感谢!

subquery batch-processing
2个回答
0
投票

根据 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
}

0
投票

您不应在批次查询定位器的查询中使用内部查询。将开始查询更改为此

global Database.QueryLocator start(Database.BatchableContext BC) {
              String query = 'SELECT Id, Name FROM Portal__c';

        return Database.getQueryLocator(query);

}

然后在execute中查询需要的Exporte__r记录。在此查询中,请记住设置限制等,否则您将再次收到“太多 DML 行”错误。

© www.soinside.com 2019 - 2024. All rights reserved.