【问题标题】:What to do when SObject is not being found?找不到 SObject 时该怎么办?
【发布时间】:2019-05-23 13:52:21
【问题描述】:

我正在尝试清空回收站。因此我需要查询记录中现有的SObjects。如果找到匹配的记录 SObject Name,则应该进行查询。否则它不应该查询任何东西。返回类型是查询。 当SObject 不存在时,我应该如何编写else 部分而不会出现崩溃问题。

我想到了一个 try catch 块,其中 try 部分将包含

if(exists){query;}

而 catch 部分不会做任何事情,这意味着它将是空的。那有意义吗? 你有什么建议?

    Boolean exists = Schema.getGlobalDescribe().containsKey(sObjectName);
 try {
       if(exists){
          return Database.getQueryLocator('SELECT Id FROM ' + sObjectName 
          +' WHERE isDeleted=true ALL ROWS');
       }
 }
 catch (QueryException ex) {
        // do nothing
 }

【问题讨论】:

    标签: apex soql custom-object


    【解决方案1】:

    假设你有一个方法会返回Database.getQueryLocator

    public Database.QueryLocator testMethod(String sObjectName )
    {
        return Database.getQueryLocator('SELECT Id FROM ' + sObjectName 
        +' WHERE isDeleted=true ALL ROWS'); 
    }
    

    调用方法前检查sObject是否存在。

    Boolean exists = Schema.getGlobalDescribe().containsKey(sObjectName);
    if(exists)
    {
       Database.QueryLocator ql = testMethod(String sObjectName);  
    }
    

    【讨论】:

    • 这也是我上面写的,只有你有一个方法内的查询返回。我对这个案例更感兴趣,当 SObject 不存在时我应该怎么做?我应该抓住这个案子吗?还是我应该不放任何其他东西,只放 if 子句?
    • 问题是,由于此检查发生在批处理的 start() 方法中,execute() 将期望查询可以使用。所以在我看来,如果找不到 SObject,批处理将无法执行。如果批处理无法执行怎么办? Salesforce 会抛出错误吗?还是无害?
    • 此外,不可能有一个具有预期返回类型 Database.QueryLocator 的 start() 并且只有一个 if 块,其中返回类型在其中。该方法不会编译,因为它仍然需要返回类型!
    • @stacicara :您能否粘贴您的完整代码或演示完整代码,以便我知道这里有什么问题。您是在 Schedulable apex 中实现它,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2016-09-02
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多