#salesforce #apex #soql
Вопрос:
Я пытаюсь сделать динамический запрос soql с несколькими параметрами, но не смог выполнить его должным образом
string knowledgeQuery = '';
string publishStatusOnline = 'Online';
// At the moment 'Knowledge__kav' only supports two languages 'is-is' and 'en-us'
if(language == 'is-is'){
language = 'is';
knowledgeQuery = 'SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline AND language = :language ORDER BY VersionNumber DESC LIMIT 1';
} else {
knowledgeQuery = 'SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline ORDER BY VersionNumber DESC LIMIT 1';
}
System.debug(knowledgeQuery);
Knowledge__kav article = Database.query(knowledgeQuery);
return article;
Строка проверки знаний Tke выглядит следующим образом SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline ORDER BY VersionNumber DESC LIMIT 1
Комментарии:
1. Каков результат? 0 строк? Исключение выдано? Разве тебе не нужно разыгрывать его?
Knowledge__kav article = ((List<Knowledge__kav>) Database.query(knowledgeQuery))[0];
Ответ №1:
После проверки кода, поскольку в нем действительно нет ничего динамического, я задался вопросом о необходимости динамического запроса. Я думаю, вы могли бы добиться в основном того же самого, сделав:
Knowledge__kav article;
String publishStatusOnline = 'Online';
// At the moment 'Knowledge__kav' only supports two languages 'is-is' and 'en-us'
if(language == 'is-is'){
language = 'is';
article = [SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline AND language = :language ORDER BY VersionNumber DESC LIMIT 1];
} else {
article = [SELECT Id, Customer_Facing_Instruction__c FROM Knowledge__kav WHERE UrlName = :name AND PublishStatus = :publishStatusOnline ORDER BY VersionNumber DESC LIMIT 1];
}
return article;
Комментарии:
1. В Базе знаний есть некоторая глупость (это другой продукт, купленный давным-давно, и он все еще отображается, например, только там вы можете использовать категории данных, «обновить viewstat» и т. Д. Странности. Это часть общей спецификации SOQL, но применимо только к КБ, переходит в другую базу данных). Вы не можете связывать переменные в скомпилированных запросах. developer.salesforce.com/docs/atlas.en-us.knowledge_dev.meta/…
2. О, я понимаю, действительно приятно это знать! Спасибо. Тем не менее, использование переменных привязки здесь можно легко обойти, поэтому я думаю, что этот подход все еще может быть использован.