Lojza Ibg Lojza Ibg - 3 months ago 36
Groovy Question

Grails GORM 3.2.0 query with `where values in list`

I upgraded my codebase from Grails 2.1.0 to 3.2.0. However, I encountered a situation that one of my queries did not work as expected.

public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.executeQuery("select l from Location l where l.placeName in (:placeNames)", [placeNames: placeNames])

Before upgrade, this query was working well. I passed in a collection of type
) and it returns correctly the list of locations. But now with new version of Grails I got this error:

java.util.LinkedHashMap$LinkedKeySet cannot be cast to java.lang.String

I digged a bit deeper inside Grails and GORM and saw that QueryTranslatorImpl translated the named parameter
to SQL AST as
[NAMED_PARAM] ParameterNode: '?' {name=placeNames, expectedType=org.hibernate.type.StringType@49c72fb7}
, but I'm not sure why.

In the end, I changed the original query to use
and DetachedCriteria:

public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.where {placeName in placeNames}.list()

This time, everything works fine and the returned result was what I expected.

What is the problem with the first query using


Seems newer versions of Hibernate are less lenient if you specify parameters that are not of type java.util.List and instead are other collection types (Set etc.)