我正在使用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?
谢谢。
答案 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)
}