Grails:方法 findAll() 的签名不适用于参数类型:String、ArrayList

标签 grails groovy grails-orm findall

我是 grails 新手,收到以下错误:
没有方法签名:Something.findAll() 适用于参数类型:(java.lang.String, java.util.ArrayList) 值:[from Something AS s WHERE s.some_number LIKE ?, [%asdf% ]]"

当我运行test-app时发生错误。它发生在以下位置:

SomethingVO[] findBySomeNumber(String searchString) {
     searchString = "%"+searchString+"%"
     return Something.findAll("from Something AS s WHERE s.some_number LIKE ?",[searchString]).collect { 
          new SomethingVO(it);    
     }
}  

Something 是一个域对象:

package some.project.domain

    class Something{

        static belongsTo = [product:Product, productVersion:ProductVersion]

        Long id
        String name
        String someNumber

        static constraints = {
            product (nullable:true)
            productVersion (nullable:true)
        }
    }  

哪里错了?

(我使用 Grails 1.2.4)

最佳答案

findAll 在单元测试期间不会被模拟,这就是您的代码无法工作的原因。在运行测试之前,您需要手动添加调用的模拟(mockFor 可以帮助您)。如果您使用 HQL 或 Criterias(我建议使用 HQL,而不是纯 HQL),则这适用。

或者,您也可以使用动态查找器来解决问题。当您在单元测试中调用 mockDomain(Something) 时,动态查找器和其他动态 ORM 方法(save、get、count 等)在大多数(?)情况下都会被模拟。它们通常也比 HQL 更容易使用(恕我直言)。

更新: 感谢 Fletch 指出并非所有动态查找器都被 mock 。不会被模拟的动态查找器的示例如下:Something.findAllWhereSomeNumberInList([1, 2, 3])

您在代码中使用的 HQL 可以使用动态查找器重写如下:

Something.findBySomeNumberLike(searchString)

关于Grails:方法 findAll() 的签名不适用于参数类型:String、ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758347/

相关文章:

java - 线程将随着时间的推移而更新,以尝试避免可能的内存泄漏

web-services - Controller 中的 Grails 2.4 服务调用但服务为空?

grails - 迭代可能是字符串或字符串数​​组的 Groovy 对象

grails - 使用多个belongsTo,但一次只有一个

来自服务的 Grails Spring Security 身份验证

database - Grails 一对一查询选项

grails - 使用grails插件数据源

image - 在Grails 3中发送带有图像的电子邮件

grails - 为什么覆盖putAt会导致MissingPropertyException?

gradle - 从闭包访问局部变量