问题理解 Salesforce Apex Trigger 在线 SOQL 中的相等性检查

问题描述

我遇到了这个我不太了解的 Apex Trigger 代码...

Id当然是一个Id hId 是一个 SET

我通常会期待 "WHERE Id IN :hId",而不是 "WHERE Id = :hId"

trigger linkHusbandAndWife on h2w_c (after insert) {
    
    Set<Id> hId = new Set<Id>();
    for (h2w_c h2w : Trigger.New) {
        hId.add(h2w);
    }
    
    List<Husband_c> husbandlist = [
        SELECT Id Wife_Id 
        FROM Husband_c 
        WHERE Id = :hId
    ];

    ...
}

问题:当 hId 是一个 SET 时,“Id = :hId”如何? 这在某种程度上等同于“Id IN :hId”吗?

解决方法

是的,用 Apex 编写的查询语法非常宽容。特别是普通的 SOQL(用 [brackets] 编写,而不是您从字符串制作查询的动态 SOQL)。它更多是 Apex 功能而不是 SOQL,您可能一直在寻找错误的参考指南。神奇之处在于“绑定变量”(:),例如,在通过 API 进行原始查询时,您不能总是使用相同的技巧。

WHERE Id = :collection 没问题。 CollectionId 类型的单个变量、集合或列表。

WHERE Id IN :collection 具有相同的结果。而且你甚至不需要括号!

这意味着您的查询可以放弃创建 Set 的中间步骤,编写更少的代码:

SELECT Id,Wife_Id__c FROM Husband_c WHERE Id IN :trigger.new

出于 SOQL 的目的,List<sObject> 将无声地“投射”到 List<Id>。我使用引号是因为通常你不能转换它,sObject 永远不会是 Id 的实例。如果您在普通代码中需要类似的行为,您需要类似 Set<Id> mySet= new Map<Id,sObject>(mylist).keyset(); 的东西。

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_variables.htm

https://developer.salesforce.com/forums/?id=906F000000090b1IAA

https://salesforce.stackexchange.com/questions/17695/how-do-i-build-a-soql-query-for-records-in-a-list-of-ids