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 似乎不太宽松
我将我的代码库从 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
等)