I am receiving the following error when running a test on my code. However, it seems to run fine in the debug line above it, so I'm confused regarding the source of the error:

System.QueryException: unexpected token: '<EOF>'

   public static void careStatusChangeRelated(String careStatusChangeRelatedSerialized) {
        // deserialize back into map
    Map<String, Set<Id>> oppEntry= (Map<String, Set<Id>>)JSON.deserialize(careStatusChangeRelatedSerialized, Map<String, Set<Id>>.class);
    List <CareProfileStatusChangeExit__mdt> allStatusCriteria = customMetadata;

    //Set up a Query to pull the needed fields from Opportunity group 
    String query = 'SELECT ';
    Set<String> queryfields = new Set<String>(); 
    for(CareProfileStatusChangeExit__mdt field: allStatusCriteria){
        //Add queryfields to update parent records
        if(field.RelatedObject__c != null  && field.RelatedObjectLookupFieldAPIName__c == null && field.APIFieldName__c != null){
            queryfields.add(field.APIFieldName__c + ','); }  
    for(String statuskey: oppEntry.keySet()){
            oppChanges.put(statuskey, oppEntry.get(statuskey));

    If (queryfields.size()>0){
        for(String q: queryfields){
            query = query + q;}

        List<Id> Vals = new List<Id>();
        For(Set<Id>ids: oppEntry.values()){
        for(Id is : ids){
        } }
        //query = query.left(query.length() - 1);  
        query = query + ' Id FROM Opportunity WHERE Id IN: Vals';
        System.debug('QUERY Vals' + Vals);
        System.debug('QUERY:' + query);
         System.debug('QUERY:' + (List<Opportunity>) Database.query(query));}
  //Iterate over each Status to update related records based on metadata criteria 
 List<Opportunity> queryResults =(List<Opportunity>) Database.query(query);
  • Please share the actual end value of your query string.
    – Adrian Larson
    Feb 16, 2018 at 16:57

1 Answer 1


When you use dynamic SOQL, you can't have an intervening space between the : and the variable after it. Change your code as follows:

    query = query + ' Id FROM Opportunity WHERE Id IN :Vals';
  • I tried: query = query + ' Id FROM Opportunity WHERE Id IN:Vals'; and query = query + ' Id FROM Opportunity WHERE Id IN :Vals'; and see the same error on both. Feb 16, 2018 at 16:50
  • I also needed to add a null check on Vals Feb 16, 2018 at 17:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.