Search code examples
grailsgroovygrails-orm

Using config driven logic in createCriteria grails


I have requirement in which i need some logic of criteria query to be config driven. Earlier i used to query like : e.g.:

User.createCriteria().list{
     or{ 
        eq('username',user.username)
        eq('name',user.name)
     }
}

But, i need this to be configurable in my use case so, i try this code snippet.

def criteriaCondition= grailsApplication.config.criteriaCondition?:{user->
         or{
           eq('username',user.username)
           eq('name',user.name)   
         }
}

User.createCriteria().list{criteriaCondition(user)}

But, This doesn't work for me. I am getting missing method exception for "or" I tried few solution from some sources but it didn't worked for me.

So, can anyone help me :

1) How to make the above given code work. 2) Any other better way for my use case.

Thanks in advance!!!


Solution

  • you have to pass criteriaBuilder object to the closure, something like this:

    def criteriaCondition = grailsApplication.config.criteriaCondition ?: { cb, user ->
         cb.or{
           cb.eq('username',user.username)
           cb.eq('name',user.name)   
         }
    }
    
    def criteriaBuilder = User.createCriteria()
    
    criteriaBuilder.list{
        criteriaCondition(criteriaBuilder, user)
    }
    

    obviously, closure in the Config.groovy also has to have the same parameters list, including cb