在 Apex 类中创建 SOQL 查询
学习目标
完成本单元后,您将能够:
- 在某个方法中创建 SOQL 查询。
- 控制 SOQL 查询返回的数据。
跟随 Trail Together 进行学习
进行这一步骤时,想要跟随专家一起学习吗?查看此视频,它是 Trailhead Live 上 Trail Together 系列的一部分。
(此视频片段从 17:32 开始,如果您想要倒回去再次观看步骤的开头部分可以从这里开始。)
简介
既然您已经了解 SOQL 查询的基本知识,您可以把公式字段知识应用到 SOQL 查询中。
我们的查询非常简单:SELECT FirstName, LastName FROM Contact
现在我们需要一个对象来保存结果数据。因为 SOQL 查询总是以列表的形式返回数据,所以我们来创建一个 Apex 列表。您在管理员 Apex 基础中学过,要声明一个列表,您需要几个东西:该列表
的保留字,数据类型(< >
字符中的内容)以及新列表的名称。对于该查询,数据类型是联系人,我们把新列表命名为 listOfContacts。列表声明如下所示:
List<Contact> listofContacts
要把查询的结果赋予新列表,我们在列表声明和查询之间放入一个赋值运算符,等号 (=
),如下所示:
List<Contact> listofContacts = [SELECT FirstName, LastName FROM Contact];
注意语法。查询放在了方括号 [ ]
中,语句以分号 (;
) 收尾。
我们在 Developer Console 中尝试一下。为进行测试,我们把联系人列表发到调试日志中,这样我们可以看到代码运行得如何。
在 Developer Console 中测试代码
- 在 Developer Console 中,单击 Debug(调试) | Open Execute Anonymous Window(打开执行匿名窗口)。
- 在“执行匿名”窗口中,把查询结果赋予新列表:
List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
- 在下一行上,把 listOfContacts 列表发送到调试日志:
system.debug(listOfContacts);
- 单击打开日志复选框。
- 单击执行。
- 在“执行日志”窗口底部,单击仅限调试复选框。
调试日志的前两项看起来应该是这样的: -
如果查询找不到任何结果,它仍然返回一个列表,但列表是空的:
[2]|DEBUG|()
这里实际上发生了什么?
代码运行时,首先处理查询:
SELECT FirstName, LastName FROM Contact LIMIT 2
查询找到所有联系人,并获取每条记录的姓和名,然后代码把来自那些联系人记录的被选中数据添加到名为 listOfContacts 的列表中。
最后,第 2 行,System.debug
显示 listOfContacts
的内容。
在 Apex 中运行 SOQL 查询
在上一个单元,您用查询编辑器在表格中返回数据。在本单元,您用“执行匿名”窗口来运行查询并把结果发送到调试日志中。这种方法暂时是可行的,但是您的用户不会在 Developer Console 中运行查询。您需要一种方法在组织的用户界面中返回数据。Apex 类和方法可以做到这一点。我们来研究如何在 Apex 中运行 SOQL 查询并控制结果。
我们先在 Apex 类中创建一个 Apex 方法。该 Apex 方法运行我们的查询,选取我们需要的数据。
- 在 Developer Console 中,单击文件 | 新建| Apex 类。
- 把这个类命名为
ContactUtility
,然后单击确定。 -
这个类打开,显示声明这个类并且为类的主体留空的代码。
- 在第 2 行,添加一个名为
viewContacts
的方法。public static void viewContacts(){ }
- 在第 3 行,在
viewContacts
方法内部,粘贴运行查询并把结果赋予新列表的代码:List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
- 保存这个类。
现在 listOfContacts
列表中便有了我们想要的数据。我们将用一个 for 循环来迭代整个列表,构建我们想要的输出格式。
使用 For 循环来迭代整个列表
在管理员面向对象的编程中,您学过如何使用 For 循环逐个处理列表中的项目。在这里,我们用 For 循环将每个联系人的姓和名组合起来,形成联系人的全名。首先,我们创建循环,然后处理这个循环内的每条记录。
为了声明 For 循环,我们需要一个变量名称、它的数据类型以及这个循环迭代的列表的名称。
在 For 循环中,我们不直接引用特定对象,而是创建一个变量来代表循环内部的列表项,一次一个。变量充当列表中每个项目的占位符。变量可以是任意名称,不过我们简单一点吧。我们用 con
,我们需要该变量的数据类型,即联系人,以及列表名称,即 listOfContacts。全部放在一起,看起来是这样的:
声明 For 循环
- 在 viewContacts 方法中,在 SOQL 查询后面,粘贴这个代码:
for (Contact con : listOfContacts){ //loop body }
- 保存这个类。
我们查询了数据库 (1),选取了数据,并把数据保存到列表中 (2),然后创建了一个 for 循环 (3)。
接着,在循环中,我们处理列表中的项目。最后,我们想以这样的格式显示 listOfContacts
中的每个联系人:
First Name:<contact's first name>, Last Name:<contact's last name>
要引用列表中某个项目的某个字段,使用点记法指定对象及其字段 (object.field)。比如,在 con(对象变量)和 FirstName(字段)之间放入一个英文句号(点记法中的“点”),引用 listOfContacts 列表中联系人对象的 FirstName 字段,如下所示:
con.FirstName
列表包含分开的姓和名字段。在 Apex 中,我们用串联来组合字段值(有时候也有文本)。(您在管理员 Apex 基础中做过一些串联。)
温习一下,做串联的时候,字段数据用 object.field
表示。文本用单引号引起来。需要的时候,不要忘了在文本的开头和结尾留空格。用加号 (+) 来组合多个字段或组合一个字段和一些文本。
我们来填充 For 循环的主体。首先,对于 listOfContacts 列表中的每一项,我们将 FirstName 和 LastName 组合在一个名叫 fullname 的新变量中:
String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
请注意 FirstName 和 LastName 之间有空格。输出应该是这样的:
First Name:Angela, Last Name:Carter
不是
FirstName:Angela,LastName:Carter
给 fullName 变量(数据类型:字符串)赋值后,我们把那个变量插入到下一行的调试语句中:
system.debug(fullName);
处理 For 循环中的列表项
- 在 viewContacts 方法中,把
//loop body
替换为以下代码:String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName);
- 保存这个类。
您的代码如下所示:
public class ContactUtility { public static void viewContacts(){ List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact]; for (Contact con : listOfContacts){ String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName); } } }
既然我们已经准备好了一个类、一个方法以及一个 SOQL 查询,那我们就来运行代码,看看它是否有效吧。要在“执行匿名”窗口中运行 Apex 代码,我们需要用点记法指定类和方法。
- 打开“执行匿名”窗口。
- 在 Enter Apex Code(输入 Apex 代码)窗口中,用以下代码替换现有代码:
ContactUtility.viewContacts();
- 确认打开日志已勾选。
- 单击执行。
- 选择仅限调试。
结果的前六行应该是:
执行日志 |
|
事件 |
详细信息 |
USER_DEBUG |
[5]|DEBUG|First Name: Rose, Last Name: Gonzalez |
USER_DEBUG |
[5]|DEBUG|First Name: Sean, Last Name: Forbes |
USER_DEBUG |
[5]|DEBUG|First Name: Jack, Last Name: Rogers |
USER_DEBUG |
[5]|DEBUG|First Name: Pat, Last Name: Stumuller |
USER_DEBUG |
[5]|DEBUG|First Name: Andy, Last Name: Young |
USER_DEBUG |
[5]|DEBUG|First Name: Tim, Last Name: Barr |
看!通过 SOQL、一个 For 循环和串联,您提取了联系人数据,把数据赋予一个列表,迭代了整个列表,并且生成了预期结果。好样的!