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