问题描述
我遇到了这个我不太了解的 Apex Trigger 代码...
我通常会期待 "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
没问题。 Collection
是 Id
类型的单个变量、集合或列表。
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/forums/?id=906F000000090b1IAA