Dynamic SOQL — Security & Additional Methods

DEX455 - Dynamic Apex 完全指南:Describe 信息、动态 SOQL/SOSL 与动态 DML

📄 第 208 页 🎬 视频课程

课程章节介绍

好,咱们接着往下看,这一页主要讲的是动态 SOQL 的几个关键点,做开发的时候经常会用到,一定要记牢。 首先,安全永远是第一位。如果我们的查询语句里拼接了用户输入的内容,就很容易被 SOQL 注入攻击。怎么防呢?就是用 `escapeSingleQuotes` 这个方法。它会把用户提供的字符串里所有的单引号前,都加上一个转义字符,这样恶意代码就不会被执行了。这是个特别基础但也特别重要的好习惯。 接下来,我们有时候需要提前知道,我这个动态查询到底会查出多少条记录。如果是静态查询,你可能直接用 `查询.size()` 或者写在循环里计数,但动态查询更方便的做法是直接调用 `Database.countQuery`。你把那个动态生成的查询字符串传进去,它直接返回给你记录的总数,非常直观。 再一个,在写批处理 Apex 或者做 Visualforce 分页的时候,我们经常在 Batch 的 `start` 方法里使用 `Database.getQueryLocator`。这个方法能根据你给的动态查询字符串,返回一个查询定位器,这样平台就能高效地分块处理海量数据了。注意,这里不是静态直接把查询写死,而是用动态字符串传入,这一点很灵活。 还有一个容易踩坑的地方,就是变量绑定的限制。写静态 SOQL 的时候,我们可以在查询里直接用 `:myVariable.field__c` 这种写法来引用字段。但在动态 SOQL 里,你可不能这么干。你必须先把那个字段的值取出来,放进一个单独的普通变量里,比如 `String accName = myVariable.Name;`,然后把 `accName` 再拼接到查询字符串中。这一点一定要记住,否则代码会报错。 最后,别忘了,动态 SOQL 跟静态查询一样,都受到 Salesforce 各种调控器限制。比如总共能查询的记录数、查询执行时间等等,限制是完全一样的,不会因为你写的是动态就放松。所以该优化的还是得优化,别指望它能绕过系统底线。 把这几点都掌握好,动态 SOQL 用起来就很得心应手了。

关键词

Apex Salesforce Developer Guide