课程章节介绍
同学们,今天我们来看一下 SOSL 查询在 Apex 里返回的结果是什么样子。你写了一个 SOSL 语句,比如搜索多个对象,它返回的其实是一个“列表的列表”。最外层是一个 List,里边的每个元素又是一个 List,这个内部列表就装着某一个对象类型的搜索结果。
重点是,返回的顺序和你查询语句里写的对象顺序完全一样。假设你写的是 FIND 'keyword' IN ALL FIELDS RETURNING Account, Contact,那返回的列表里,第一个元素就是 Account 的搜索结果列表,第二个是 Contact 的列表。如果某个对象根本没搜到任何记录,它也不会直接被去掉,而是给你一个空的 List,这样你可以放心地用索引去访问,不会乱掉。
接下来看 FIND 子句里的值怎么写。在 Apex 代码里,一定要用单引号把搜索词包起来,像这样 'keyword'。这个和 SOAP API、REST API 不一样,它们是用大括号 {keyword} 包裹的,很多从 API 转过来写 Apex 的同学容易在这里犯错,记得 Apex 里就是单引号。
还有一个安全相关的地方要注意。当你使用 IN ALL FIELDS 扫描时,Apex 默认是在“系统模式”下运行,也就是说它拥有全部的权限,会直接忽略掉字段级的安全性设置。哪怕某个用户没有某个字段的查看权限,SOSL 仍然能通过 ALL FIELDS 把那个字段的数据搜出来,并在结果里返回。所以我们在开发时,如果需要控制权限,就要留意这一点,或者在类上加 with sharing 来做限制,当然那种限制主要影响的是对象级和记录级,字段级还是要自己过滤。
好了,关于 SOSL 返回结构和这几个小细节就讲到这里,大家写的时候多注意一下顺序、引号还有权限的影响就好。
关键词
Apex
Salesforce
Developer Guide