我将代码库从Grails 2.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
类型的集合(来自HashMap.getKeySet()
),它正确返回了位置列表。但是现在使用新版本的Grails我遇到了以下错误:java.util.LinkedHashMap$LinkedKeySet cannot be cast to java.lang.String
我对Grails和GORM进行了更深入的研究,发现QueryTranslatorImpl将命名参数
placeNames
转换为sqlt_code到SQL AST,但是我不确定为什么。最后,我将原始查询更改为使用
[NAMED_PARAM] ParameterNode: '?' {name=placeNames, expectedType=org.hibernate.type.StringType@49c72fb7}
和DetachedCriteria:public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.where {placeName in placeNames}.list()
}
这次,一切正常,返回的结果是我所期望的。
使用
where
的第一个查询有什么问题? 最佳答案
如果您指定的参数不是java.util.List
类型,而是其他集合类型(Set
等),则较新版本的Hibernate似乎不太宽容。