Grails GORM 3.2.0 查询“列表中的值”

Grails GORM 3.2.0 query with `where values in list`

我将我的代码库从 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()),它 returns 正确地列出了位置列表。但是现在使用新版本的 Grails 我得到了这个错误:

java.util.LinkedHashMap$LinkedKeySet cannot be cast to java.lang.String

我深入研究了 Grails 和 GORM,发现 QueryTranslatorImpl 将命名参数 placeNames 转换为 SQL AST 为 [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 的第一个查询有什么问题?

如果您指定的参数不是 java.util.List 类型而是其他集合类型(Set 等)

,则新版本的 Hibernate 似乎不太宽松