根据Grails文档
Grails还允许您使用Java编写域模型或重用已有Hibernate映射文件的现有模型。只需将映射文件放入grails-app / conf / hibernate,如果域模型打包为JAR,则将Java文件放在src / java或项目的lib目录中。你仍然需要hibernate.cfg.xml!
所以这就是我所做的。
我已经使用java域模型和hibernate.cfg.xml文件进行映射。我也用 {DomainName} Constraints.groovy用于添加Grails约束。我还习惯在{DomainName}约束中添加函数。例如,下面是我的EmployeeConstraints.groovy
的内容Employee.metaClass.static.findByDepartment = {depCode ->
createCriteria().list {
department{
inList ('code', depCode)
}
}
}
现在这很好用。但是,当我向它添加投影(下面的代码)时,只是为了获得员工代码。
Employee.metaClass.static.findByDepartment = {depCode ->
createCriteria().list {
projections { property('empCode', 'empCode') }
department { inList ('code', depCode) }
}
}
我收到以下错误..
"没有方法签名:com.package.script142113.projections()适用于参数类型。"
有人能指出我的代码有什么问题吗?
谢谢!
答案 0 :(得分:1)
property
投影用于返回对象属性的子集。例如,要仅返回foo
和bar
属性,请使用:
projections {
property('foo')
property('bar')
}
您收到错误是因为您已使用2个参数而不是1个参数调用property
方法。
顺便说一句,我看到了你的代码的另一个潜力。 Grails将自动创建一个动态查找器findByDepartment
,其名称与您尝试通过元类添加的方法相同。我不知道哪一个会优先考虑,但我建议你通过使用Grails'添加此查询来避免这个潜在问题并简化代码。 named query支持,并将其命名为getByDepartment
,以便该名称不会使用动态查找器进行分类。
答案 1 :(得分:0)
Dónal的回答应该是正确的,但我发现了一个带有grails 3.1的奇怪行为。我使用此调用得到了相同的消息:
Announcement.createCriteria().list {
projections {
property('id')
property('title')
}
} .collect { [id: it['id'], title: it['title']] } // it['id'] not found
我通过删除投影封闭来修复它:
Announcement.createCriteria().list {
property('id')
property('title')
} .collect { [id: it['id'], title: it['title']] } // got the it['id']
希望得到这个帮助。