这个问题涉及在Grails的静态映射块中使用公式字段。
我正在尝试实现一个使用公式映射(派生属性)的非常简单的域类,但我不断得到“No property found for name [uptime]
”,其中uptime是Grails域类中的派生属性。代码如下(简化):
class Derive {
Integer up
Integer down
static mapping = {
uptime formula : "UP/(DOWN+UP)"
}
}
class DeriveTests extends GroovyTestCase {
void testDerivedProp() {
new Derive(up:10, down:5).save()
new Derive(up:5, down:5).save()
assertEquals Derive.all.size(),2
assertEquals 2,Derive.findAllByUptimeGreaterThan(0.1).size() //fails here
assertEquals 2,Derive.findAllByUptimeGreaterThan(10/(10+5)).size()
}
}
运行测试会在第二个assertEquals:org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [uptime] for class [class Derive]
给出错误。我曾经多次咨询Grails In Action和reference docs,看不出我在做错了什么。
关于我做错了什么的线索?支持db是在内存中运行的HSQLDB,具有默认设置(由grails create-app创建)。
编辑:我有点不确定是否应该为公式添加属性字段。如果我确实添加了属性字段'Double uptime',则断言仍然失败,但这次是因为正常运行时间为0.在调试器中查看对象显示正常运行时间为空。不过,sql输出显示了一些看起来正确的东西:hibernate.SQL select this_.id as id6_0_, this_.version as version6_0_, this_.down as down6_0_, this_.up as up6_0_, this_.UP*100/(this_.DOWN+this_.UP) as formula0_0_ from derive this_
答案 0 :(得分:2)
暂时没有新答案,所以我发帖总结:
最后一点,手动刷新,看起来非常不优雅,但我还没找到解决办法。
答案 1 :(得分:1)
首先:正常运行时间不是原始类型,也不是类类型。也不确定为什么要使用映射。或者你可以在你的类中创建一个瞬态属性“正常运行时间”,然后给它一个getter方法:
我会使用Double而不是Integer:
class Derive {
Integer up
Integer down
static transients = ['uptime']
Integer getUptime(){
Integer uptime = up/(down+up)
return uptime
}
}
然后在您的代码中访问它:
def derive = new Derive()
def uptime = derive.uptime