我将代码库从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似乎不太宽容。

10-06 01:06