【发布时间】:2017-03-19 23:02:44
【问题描述】:
我将我的代码库从 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 转换为 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 hibernate grails groovy grails-orm