有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Grails GORM 3.2.0查询,带有“列表中的where值”`

我将代码库从Grails2.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(from HashMap.getKeySet())的集合,它正确返回位置列表。但现在有了新版本的Grails,我遇到了以下错误:

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

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


共 (1) 个答案

  1. # 1 楼答案

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