盘点Salesforce中Database.Query,Database.countQuery和Database.getQueryLocator

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/itsme_web/article/details/87168318

前言】:
19年CNY开工第一天学习了下同事写的代码,发现了Database.countQuery,很是好奇,于是起意盘一下这3个Database方法,并和大家分享,以期共同进步!

我们知道这三种方法都可以实现动态查询的效果,这篇文章将借助一些简单的代码片段来展示下它们在日常开发中的功效。

Database.Query】:
该方法允许开发人员使用String的形式写查询,它将返回一个单个的sObject或sObject List类型;
Ex1: 查询返单个的sObject:

sObject so = Database.query('SELECT Id FROM Account Limit 1');
System.debug(so);

上述代码片段我们会使用Limit 1来保证输出结果为单个sObject类型,该应用场景通常会出现2种问题:
1. 如果查询未加Limit 1,Account有多条记录会显示:System.QueryException: List has more than 1 row for assignment to SObject
2. 如果查询加了Limit1,Account无记录时会显示:System.QueryException: List has no rows for assignment to SObject
所以通常不建议使用单个sObject来接收单条数据,而倾向使用List<sObject>类型

Ex2: 查询返List<sObject>:

List<sObject> sobjList = Database.query('SELECT Id FROM Account ');

Database.countQuery】:
有时我们使用动态查询需要返回记录的总条数,该方法将返回Integer类型的数值;
Ex3: 返回记录个数:

Integer totalAccounts = Database.countQuery('SELECT count() FROM Account');

注意:该方法不能使用聚合字段属性结果,下边示例使用字段的聚合属性将抛出如下错误:System.QueryException: Use query() for non-count queries

Integer totalAccounts = Database.countQuery('SELECT count(id) FROM Account');

限制:该方法查询记录个数的上限是5万条,超出限制将抛出如下错误:Too many query rows: 50001 from with count()
突破:假如我们查询的记录个数超过5万条,我们将使用如下技巧来实现,其限制是100万条记录:
trick1:

Integer recCount = 0;
for(AggregateResult result :[SELECT COUNT(Id) total FROM Account])
    recCount+=(Integer)result.get('total');
System.debug('No Of Records:'+recCount);

trick2:

AggregateResult results = database.query('SELECT COUNT(Id) result FROM someSObject');
System.debug('No of ids are: '+results.get('result')); // Id are always unique

猜你喜欢

转载自blog.csdn.net/itsme_web/article/details/87168318