【问题标题】:Grails formula field not found未找到 Grails 公式字段
【发布时间】:2011-05-03 14:52:45
【问题描述】:

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

我正在尝试实现一个非常简单的域类,它使用公式映射(派生属性),但我不断收到“No property found for name [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 几次之后,我看不出我做错了什么。

关于我做错了什么的任何线索?后备数据库是一个在内存中运行的 HSQLDB,具有默认设置(由 grails create-app 创建)。

编辑:我有点不确定是否应该为公式添加属性字段。如果我确实添加了一个属性字段“双倍正常运行时间”,则断言仍然失败,但这次是因为正常运行时间为 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_

【问题讨论】:

  • 我好像已经解决了。有些。为了使它工作,我需要添加一个名为 uptime 的字段,它是一个 Double。我原以为这应该足够了,因为公式中除法返回的数字是浮点数,但似乎适用正常的整数除法规则 - 因为结果始终为零。因此,为了使测试工作,我需要指定所有三个字段都是 Doubles。即使一切正常,查询派生值的对象仍然会给你 null。去图吧。
  • 我知道为什么它在属性上返回 null。请参阅我在 Ziad Jayyousi 回答下的最后一条评论。

标签: grails groovy grails-orm formula hibernate-mapping


【解决方案1】:

一段时间没有新答案,所以我发布一个总结:

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

最后一点,手动刷新,看起来很不雅观,不过我还没有找到解决办法。

【讨论】:

    【解决方案2】:

    首先:正常运行时间不是原始类型,也不是类类型。也不确定你为什么使用映射来解决这个问题。或者你可以在你的类中创建一个瞬态属性“uptime”,然后给它一个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
    

    【讨论】:

    • “正常运行时间不是原始类型也不是类类型”是什么意思?你的意思是它是无类型的吗?如果是这样,我应该在类中添加一个包含其名称和类型的字段吗?
    • 至于为什么……通常只做一些简单的事情就知道它有效对我来说已经足够有价值了。
    • class Derive { Double up Double down Double uptime ... 知道为什么这也不起作用吗?这里没有整数除法,但我仍然在测试中得到 0/null。
    • 是的,正常运行时间不是一个类型,也不是一个类。您是否将值分配给向上 + 向下?看起来 up+down 的总数为 null 并且 0/null 引发异常。彻底检查你的代码。
    • 也看看这个使用公式,在你的代码中你没有声明正常运行时间:jira.grails.org/browse/GRAILS-5688
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多