Grails GORM 3.2.0查询`where list in list`

时间:2016-11-06 15:24:28

标签: java hibernate grails groovy gorm

我将我的代码库从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() } 的第一个查询有什么问题?

1 个答案:

答案 0 :(得分:0)

如果指定的参数不是java.util.List类型的参数而是其他集合类型(Set等),那么似乎较新版本的Hibernate不太宽松。)