Reputation: 21
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
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
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