【问题标题】:Grails GORM 3.2.0 query with `where values in list`Grails GORM 3.2.0 使用“列表中的值”查询
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 你是对的,谢谢!你知道那里到底发生了什么变化吗?
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2021-08-31
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多