user3846586
user3846586

Reputation: 43

Grails findAll closure combine query with hasmany field

As per the below Domain Classes

VisitSchedules{
    Visit visit
    static hasMany = [users: User]
    ...
}

Visit{
    DateTime startTime
    ...
}

I want to query VisitSchedules for visits that are scheduled for a future date for the user. something like below

def upcomingVisitSchedules = VisitSchedules.findAll {
    visit.startTime >= new DateTime() && users.contains(user)//How do I query if the users list contains the current user?
}

Upvotes: 1

Views: 1464

Answers (4)

igilfanov
igilfanov

Reputation: 353

and... Construction VisitSchedules.findAll, VisitSchedules.where and VisitSchedules.withCriteria are not self-sufficient and not reliable. Always use construction VisitSchedules.createCriteria().

class VisitScheduleService {

   def springSecurityService

   void run{
    SecUser currentUser = springSecurityService.currentUser

    def upcomingVisitSchedules = VisitSchedules.createCriteria().list() {
       and {
          visit {
             le('startTime', new DateTime())
          }
          eq('user', currentUser)
       }
    }  
  }

}

Upvotes: 1

igilfanov
igilfanov

Reputation: 353

class VisitScheduleService {
    def springSecurityService
    void run{
        SecUser currentUser = springSecurityService.currentUser
        def upcomingVisits = VisitScheduleNotification.createCriteria().list(){
            and{
                visit{
                    ge('startTime', new DateTime())
                }            
                'in'('users', [currentUser])
            }
        }
    }
}

Upvotes: 0

user3846586
user3846586

Reputation: 43

thanks for your response it helped a lot, here is how it looks now.

class VisitScheduleService {
    def springSecurityService
    void run{
        SecUser currentUser = springSecurityService.currentUser
        def upcomingVisits = VisitScheduleNotification.createCriteria().list(){
            and{
                visit{
                    ge('startTime', new DateTime())
                }
                users{
                    eq('id', user.id)
                }
            }
        }
    }
}

I have one question though: Question: I was trying out the 'in'("users",user) criteria method to look for the user in the property static hasMany = [users: User]

def upcomingVisits = VisitScheduleNotification.createCriteria().list(){
            and{
                visit{
                    ge('startTime', new DateTime())
               }
               'in'('users', user)
            }
        }

but couldn't achieve what I needed?

Upvotes: 0

igilfanov
igilfanov

Reputation: 353

class VisitScheduleService {

   def springSecurityService

   void run{

    SecUser currentUser = springSecurityService.currentUser

    def upcomingVisitSchedules = VisitSchedules.findAll {
            visit.startTime >= new DateTime() && users.contains(currentUser)
    }

   }

}

Upvotes: 0

Related Questions