独立使用GORM使用Domain.findBy [property]时遇到的问题

时间:2019-01-04 13:04:51

标签: grails groovy gorm

我正在使用GORM进行项目,根本没有任何Grails,并且在尝试执行findByX时遇到问题。例如,当我尝试

  

Country.findByName(“加拿大”)

该项目无法编译,它给了我

  

错误:(80,9)Groovyc:[静态类型检查]-找不到匹配方法app.domain.location.Country#findByName(java.lang.String)。请检查声明的类型是否正确以及该方法是否存在。

即使“名称”字段存在。

但是,我能够在CountryService.groovy中通过以下方式定义findByName方法:

@Where({ name == countryName })
static Country findByName(String countryName){
    Country.findAll().first()
}

但是我认为这根本不是一个好习惯。

总而言之,是否需要依赖项,配置或执行Domain.findByX()之类的GORM查询所需的任何东西?还是不能单独使用GORM?

谢谢。

2 个答案:

答案 0 :(得分:1)

您的问题不是GORM方法不存在(最终);这是因为它在编译时不存在,并且您似乎正在使用tagA()(或在默认位置配置了项目)。

从Grails文档(讨论Gorm和CompileStatic)中: https://docs.grails.org/latest/guide/staticTypeCheckingAndCompilation.html

  

使用CompileStatic的一个限制是,当您使用它时,会给出   获得动态调度所提供的功能和灵活性。   例如,在Grails中,您将无法调用GORM动态   标记为CompileStatic的类中的查找程序,因为   编译器无法验证动态查找器方法是否存在,因为   它在编译时不存在。

如果要使用GORM动态查找器,则需要使用这些查找器为方法/类关闭@CompileStatic。因此,请删除@CompileStatic批注,或添加@CompileStatic

其他相关:

答案 1 :(得分:0)

使用数据服务绝对是个好主意,尽管在没有实现或interface注释的情况下,最好将示例编写为class而不是@Where静态的。

@Service(Country)
interface ICountryDataService {
    Country findByName(String name)
}

方法定义的参数应与域类中的字段具有相同的名称。只要返回值不是集合,它将返回它找到的第一个。

当查询变得更加复杂时,@Where注释会很有用:

@Service(Country)
interface ICountryDataService {
    @Where({ name ==~ pattern })
    List<Country> searchCountriesByPattern(String pattern)

    Country findByName(String name)
}