Я пытаюсь написать динамический запрос SOQL с вложенным запросом.

@AuraEnabled
public static List<Books__c> filterRecords(String bookNumber, String PDCN, String Brand, String Type){
    System.debug('bookNumber__c->'+bookNumber__c);
    System.debug('PDCN->'+PDCN);
    System.debug('Brand->'+Brand);

    String query = 'SELECT Id,Content__c,ForecastWeekIndicator__c,Generic_PDCN__c,isExpired__c, '+
        'BrandStandardName__c,DPForecast_BaseUnits__c,ForecastStatus__c,Generic_DateTime__c, '+
        'Type__c,OperationalForecast_BaseUnits__c,PackageStandardName__c,bookNumber__c__c '+
        'FROM Books__c WHERE Type__c =:Type '+
        'AND Id NOT IN (SELECT Books__c FROM User_Specific_Books__c '+ 
        'WHERE Books_Delete__c = TRUE AND User__c = : UserInfo.getUserId())';
    if(string.isNotEmpty(bookNumber__c) && bookNumber__c!=null){
        query = query + ' AND bookNumber__c__c =: bookNumber__c';
    }
    if(string.isNotEmpty(PDCN) && PDCN != null){
        query = query + ' AND Generic_PDCN__c =: PDCN';
    }
    if(string.isNotEmpty(Brand) && Brand != null){
        query = query + ' AND BrandStandardName__c =: Brand';
    }
    System.debug('query--->'+query);
    List<Notification__c> lst;

    try{
        lst = Database.query(query);
        system.debug('List--->'+lst);

    }catch(Exception e){
        system.debug(e.getMessage());
    }

    if(!lst.isEmpty()){
        return lst;
    }
    else
        return null;
    }
}

И я получаю исключение ожидание правильных скобок, найдено '('. Любое объяснение будет оценено.

5
Mark Pond 18 Мар 2019 в 19:34
Томас, если один из приведенных ниже ответов решил вашу проблему, рассмотрите принять его, нажав на галочку/галочку слева от ответа, сделав его зеленым. Это помечает вопрос как разрешенный к вашему удовлетворению и присуждает репутацию как вам, так и человеку, который ответил. Если у вас >= 15 очков репутации, вы также можете проголосовать за ответ, если хотите. Обязанности делать тоже нет.
 – 
Adrian Larson
26 Июн 2019 в 16:42

1 ответ

Вы не можете использовать настоящий Apex в динамических запросах. Допускаются только «простые» переменные. Проблема в следующей строке.

    'WHERE Books_Delete__c = TRUE AND User__c = : UserInfo.getUserId())';

Сначала присвойте значение переменной:

Id userId = UserInfo.getUserId();
...
    'WHERE Books_Delete__c = TRUE AND User__c = :userId)';
8
sfdcfox 18 Мар 2019 в 17:51
Пожалуйста! P.S. String.isNotBlank также проверяет нулевые значения, нет необходимости проверять это отдельно в вашем коде.
 – 
sfdcfox
18 Мар 2019 в 17:56