找不到Grails公式字段

时间:2011-05-03 14:52:45

标签: grails groovy gorm formula hibernate-mapping

这个问题涉及在Grails的静态映射块中使用公式字段。

我正在尝试实现一个使用公式映射(派生属性)的非常简单的域类,但我不断得到“No property found for name [uptime]”,其中up​​time是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_

2 个答案:

答案 0 :(得分:2)

暂时没有新答案,所以我发帖总结:

  • 公式必须有一个字段才能生效。
  • 派生属性始终是可搜索的,因为这涉及数据库搜索,但如果保存的版本仍在缓存中,则对象的属性将始终为null。简而言之:在搜索之前清除会话缓存或刷新缓存对象(obj.refresh())

最后一点,手动刷新,看起来非常不优雅,但我还没找到解决办法。

答案 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