Поле формулы Грааля не найдено - PullRequest
0 голосов
/ 03 мая 2011

Этот вопрос касается использования поля формулы в блоке статического сопоставления в 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 и справочными документами несколько раз.

Есть какие-нибудь подсказки относительно того, что я делаю неправильно?Резервная база данных - это HSQLDB, работающий в памяти с настройками по умолчанию (созданными grails create-app).

edit: Я немного не уверен, следует ли мне добавлять поле свойства для формулы или нет.Если я добавлю поле свойства «Двойное время безотказной работы», утверждение все равно не будет выполнено, но на этот раз, потому что время безотказной работы равно 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 ]

2 голосов
/ 09 июня 2011

Нет новых ответов через некоторое время, поэтому я отправляю сумму:

  • Для работы формулы должно быть поле для формулы.
  • Производное свойство всегда доступно для поиска, так как это включало поиск в базе данных, но свойство объекта всегда будет нулевым, если сохраненная версия все еще находится в кэше. Вкратце: очистите кэш сеанса перед поиском или обновите кэшированный объект (obj.refresh ())

Последний бит, обновляемый вручную, кажется очень не элегантным, но я не нашел способа обойти это.

1 голос
/ 03 мая 2011

Первое: uptime не является ни примитивным, ни типом класса.Также не уверен, почему вы используете отображение по этому вопросу.В качестве альтернативы вы можете создать временное свойство "uptime" в вашем классе, а затем дать ему метод получения:

Я бы использовал 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
...