Accessing sObject Fields Through Relationships

DEX455 - Apex SOQL 与 SOSL 查询完全指南

📄 第 182 页 🎬 视频课程

课程章节介绍

同学们,今天咱们来聊一个很实用的话题,就是 sObject 记录是怎么通过字段来表示和其他记录的关系的。你可能会想,不就是个外键嘛,但 Salesforce 在这上面的设计有一些很巧妙的地方,我们一块儿看看。 首先,在 sObject 里,关系是用两个字段来表示的。一个叫 ID 字段,就是一个单纯的记录 ID,像 AccountId 这种。另一个叫引用字段,它是一个指向关联 sObject 对象的引用,比如直接拿到一个 Account 对象。这两个字段其实是一体两面,你查一个联系人的时候,既能看到 AccountId 这个字符串,也能通过 Account 这个引用直接访问到对应客户的名称、电话什么的。 接下来是重点:当你在代码里读取这个关系的时候,如果引用是空的,系统不会像 Java 那样给你扔一个烦人的 NullPointerException。它会直接返回空值,表达式的结果就是 null。这样做的好处是,你完全可以放心地连续点下去,比如 contact.Account.Name,就算这个联系人没关联客户,得到的也只是 null,程序不会崩。这就是他们为了让代码更简洁做的保护。 但是注意啦,修改的时候就不一样了。如果你尝试对一个空的引用进行赋值操作,那对不起,这个时候空指针异常就会冒出来。所以读可以随便读,写之前最好还是检查一下引用是不是 null。 另外,Salesforce 还给关系字段安排了一个很高效的功能,就是通过外部 ID 来关联记录。我们在做 insert 或者 update、upsert 的时候,可以在关联的引用字段里直接塞一个对象,这个对象不用填 ID,只需要填上那个唯一的外部 ID 字段。系统会自动帮你解析,找到对应的记录。这就省去了你先查询一次数据库,拿到 ID 之后再赋值的步骤,效率高多了。 不过要注意,这种通过外部 ID 解析的方式,只能帮你设置关联关系,它并不会去更新那个关联记录本身的其他字段。假如你想同时修改客户那边的某个字段,那你必须再单独写一条 DML 语句去更新那个客户记录。关系建立和记录内容的修改,是两码事,需要分开处理。 好了,今天这几个点记清楚,以后写 Apex 操作记录关系的时候,就能写出既安全又高效代码了。有什么疑问,随时停下来问我。

关键词

Apex Salesforce Developer Guide