Динамический запрос для выполнения действия SOQL не работает

#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. О, я понимаю, действительно приятно это знать! Спасибо. Тем не менее, использование переменных привязки здесь можно легко обойти, поэтому я думаю, что этот подход все еще может быть использован.