java - 使用 `where values in list`的Grails GORM 3.2.0查询

标签 java hibernate grails groovy gorm

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

关于java - 使用 `where values in list`的Grails GORM 3.2.0查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40451011/

相关文章:

java正则表达式,仅当不在引号或括号中时才以逗号分隔

spring - org.hibernate.HibernateException : No CurrentSessionContext configured

grails - 用户类和Spring Security ui插件中的电子邮件字段

java - 重启后 pycharm 在 Ubuntu 中无法启动

java - 为什么我在此 Java 程序中收到 ArrayIndexOutOfBoundsException?

java - spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 的区别

java - Spring应用中如何实现Hibernate DAO的一些疑惑

java - 如何让 IntelliJ 为非基于 ruby​​ 的项目加载我的 .rvmrc?

grails - Grails如何使用注释来过滤 Controller Action

java - 如何根据目标设备分离库?