Grails Criteria Projection - 方法projection()的签名不适用于参数类型

时间:2015-01-13 10:07:49

标签: grails

根据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()适用于参数类型。"

有人能指出我的代码有什么问题吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

property投影用于返回对象属性的子集。例如,要仅返回foobar属性,请使用:

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']

希望得到这个帮助。