java Grails GORM 3.2.0查询,带有“列表中的where值”`
我将代码库从Grails2.1.0升级到3.2.0。但是,我遇到了一种情况,我的一个查询没有按预期工作
public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.executeQuery("select l from Location l where l.placeName in (:placeNames)", [placeNames: placeNames])
}
升级之前,此查询运行良好。我传入了类型为LinkedKeySet
(from HashMap.getKeySet()
)的集合,它正确返回位置列表。但现在有了新版本的Grails,我遇到了以下错误:
java.util.LinkedHashMap$LinkedKeySet cannot be cast to java.lang.String
我深入研究了Grails和GORM,发现QueryTranslatorImpl将命名参数placeNames
转换为SQLAST作为[NAMED_PARAM] ParameterNode: '?' {name=placeNames, expectedType=org.hibernate.type.StringType@49c72fb7}
,但我不知道为什么
最后,我将原始查询更改为使用where
和DetachedCriteria:
public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.where {placeName in placeNames}.list()
}
这一次,一切正常,返回的结果正是我所期望的
使用executeQuery
的第一个查询有什么问题
# 1 楼答案
如果指定的参数不是
java.util.List
类型,而是其他集合类型(Set
等),则Hibernate的较新版本似乎不那么宽松