user2489820
user2489820

Reputation: 21

Issues using findAllBy method to access a list of properties on an object

Here is the code to take a list of tags generated by params and passed into the service from the controller. I'm trying to filter the list of eateries to ONLY contain eateries with matching tag properties. I'm new to programming and grails so please forgive any silly mistakes:

    class Eatery {
        String name
        String phone
        Date lastVisited
        List<Tag> tags
        static hasOne = [location: Location]
        static hasMany = [tags: Tag];
        static constraints = {
            name nullable: false, blank: false
            phone nullable: true, blank: true
            location nullable: true, blank: true
            tags nullable: true, blank: true
            lastVisited nullable: true, blank: true
        }
        public String toString() {
            return name
        }
}

Here is the service method:

Eatery getRandomEatery(List<Tag> tagList) {
    List<Eatery> eateryList = Eatery.findAllByTags(tagList)
    Random random = new Random()
    Integer n = eateryList.size()
    Integer selection = Math.abs(random.nextInt(n))
    Eatery eatery = eateryList.get(selection)
    return eatery
}

And here is the error:

 Class
org.h2.jdbc.JdbcSQLException
Message
Parameter "#1" is not set; SQL statement: select this_.id as id2_0_, this_.version as version2_0_, this_.last_visited as last3_2_0_, this_.name as name2_0_, this_.phone as phone2_0_ from eatery this_ where this_.id=? [90012-164]
Around line 16 of grails-app/services/grubspot/RandomizerService.groovy
13://14://        }15:        List<Eatery> eateryList = Eatery.findAllByTags(tagList)16:        Random random = new Random()17:        Integer n = eateryList.size()18:        Integer selection = Math.abs(random.nextInt(n))19:        Eatery eatery = eateryList.get(selection)

Upvotes: 2

Views: 164

Answers (2)

Eylen
Eylen

Reputation: 2677

I think you could make the query with a criteria with something similar to...

List<Eatery> eateryList = Eatery.withCriteria{
    tags {
        "in" "id", tagList.id
    }
}

haven't tested it, but should give you an idea

Upvotes: 1

James Kleeh
James Kleeh

Reputation: 12228

Change

List<Eatery> eateryList = Eatery.findAllByTags(tagList)

to

List<Eatery eateryList = Eatery.executeQuery("""
select e
from Eatery e left join e.tags as t
where t in (:tagList)""", [tagList: tagList])

Upvotes: 1

Related Questions