Lojza Ibg Lojza Ibg - 1 month ago 17
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
LinkedKeySet
(from
HashMap.getKeySet()
) 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
placeNames
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
where
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
executeQuery
?

Answer

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.)