v4.2.0
03-February-2025
Scope
SOQL
Queryable toLabel(SObjectField field, String alias);Queryable toLabel(String field, String alias);Queryable sort(String direction);Map<String, SObject> toMap(String relationshipName, SObjectField targetKeyField);Map<String, List<SObject>> toAggregatedMap(String relationshipName, SObjectField targetKeyField);- Issued queries counter
- Code refactoring
SOQL.SubQuery
SubQuery with(String fields);SubQuery orderBy(String field);SubQuery sort(String direction);
SOQL.FilterGroup
FilterGroup add(List<Filter> filters)FilterGroup add(List<String> dynamicConditions)
SOQLCache
removeFromCache(List<SObject> records)
SOQL
toLabel(SObjectField field, String alias)
Enhancement: #147
You can specify the toLabel(field) alias to avoid the error: “duplicate field selected: field”.
Signature
Queryable toLabel(SObjectField field, String alias);
Queryable toLabel(String field, String alias);Example
SELECT Status, toLabel(Status) leadStatus FROM LeadSOQL.of(Lead.SObjectType)
.with(Lead.Status)
.toLabel(Lead.Status, 'leadStatus')
.toList();SELECT Company, toLabel(Recordtype.Name) recordTypeName FROM LeadSOQL.of(Lead.SObjectType)
.with(Lead.Company)
.toLabel('Recordtype.Name', 'recordTypeName')
.toList();Map<String, SObject> toMap(String relationshipName, SObjectField targetKeyField)
Enhancement: #144
Signature
Map<String, SObject> toMap(String relationshipName, SObjectField targetKeyField);Example
❌
Map<String, Account> parentCreatedByEmailToAccount = new Map<String, Account>();
for (Account account : [SELECT Id, Parent.CreatedBy.Email FROM Account]) {
parentCreatedByEmailToAccount.put(account.Parent.CreatedBy.Email, account);
}✅
Map<String, Account> parentCreatedByEmailToAccount =
(Map<String, Account>) SOQL.of(Account.SObjectType).toMap('Parent.CreatedBy', User.Email);Map<String, List<SObject>> toAggregatedMap(String relationshipName, SObjectField targetKeyField);
Enhancement: #144
Signature
Map<String, List<SObject>> toAggregatedMap(String relationshipName, SObjectField targetKeyField);Example
❌
Map<String, List<Account>> parentCreatedByEmailToAccount = new Map<String, List<Account>>();
for (Account account : [SELECT Id, Parent.CreatedBy.Email FROM Account]) {
if (!parentCreatedByEmailToAccount.containsKey(account.Parent.CreatedBy.Email)) {
parentCreatedByEmailToAccount.put(account.Parent.CreatedBy.Email, new List<Account>());
}
parentCreatedByEmailToAccount.get(account.Parent.CreatedBy.Email).add(account);
}✅
Map<String, List<Account>> parentCreatedByEmailToAccounts =
(Map<String, List<Account>>) SOQL.of(Account.SObjectType).toAggregatedMap('Parent.CreatedBy', User.Email);Issued queries counter
Mocked queries are now counted by SOQL Lib, and if the number of issued queries exceeds 100, a new QueryException('Too many SOQL queries.') will be thrown. This allows you to catch the issue in your unit tests.
SOQL.SubQuery
Thanks, @salberski for the collaboration!
SubQuery with(String fields);
Signature
SubQuery with(String fields)Example
SELECT Id, (
SELECT Id, Name, Phone, RecordTypeId, Title, Salutation
FROM Contacts
) FROM AccountSOQL.of(Account.SObjectType)
.with(SOQL.SubQuery.of('Contacts')
.with('Id, Name, Phone, RecordTypeId, Title, Salutation')
)
.toList();SubQuery orderBy(String field);
Signature
SubQuery orderBy(String field)Example
SELECT Id, (
SELECT Id
FROM Contacts
ORDER BY Name
) FROM AccountSOQL.of(Account.SObjectType)
.with(SOQL.SubQuery.of('Contacts')
.orderBy('Name')
)
.toList();SubQuery sort(String direction);
Signature
SubQuery sort(String direction)Example
SELECT Id, (
SELECT Id
FROM Contacts
ORDER BY Name DESC
) FROM AccountSOQL.of(Account.SObjectType)
.with(SOQL.SubQuery.of('Contacts')
.orderBy('Name')
.sort('DESC')
)
.toList();SOQL.FilterGroup
Thanks, @salberski for the collaboration!
Signature
FilterGroup add(List<Filter> filters);
FilterGroup add(List<String> dynamicConditions);Example
// SELECT Id FROM Account WHERE (Name = 'Test' AND BillingCity = 'Krakow')
SOQL.of(Account.SObjectType)
.whereAre(SOQL.FilterGroup
.add(new List<SOQL.Filter> {
SOQL.Filter.with(Account.Name).equal('Test'),
SOQL.Filter.with(Account.BillingCity).equal('Krakow')
})
).toList();// SELECT Id FROM Account WHERE (Name = 'Test' AND BillingCity = 'Krakow')
SOQL.of(Account.SObjectType)
.whereAre(SOQL.FilterGroup
.add(new List<String> {
'Name = \'Test\'',
'BillingCity = \'Krakow\''
})
).toList();SOQLCache
removeFromCache(List<SObject> records)
The removeFromCache method clears records from the cache, triggering an automatic refresh the next time the query is executed.
Thanks, @patrykacc for the collaboration!
Signature
Cacheable removeFromCache(List<SObject> records);Example
trigger SomeObjectTrigger on SomeObject (after update, after delete) {
SOQLCache.removeFromCache(Trigger.new);
}New Contributors
- @patrykacc in #143
- @salberski in #153