2016-11-07 8 views
1

меня такая ситуация:Как использовать вложенные атрибуты вместе с атрибутами из класса в критериях с Grails?

country { 
    and { 
     rates{ 
           and{ 
            between('effectiveDate', startDate, endDate) 
            or { 
             and { 
              eq('hoursEligible', true) 
              gt('hours', new BigDecimal(0)) 
             } 
             and { 
              eq('travelTimeEligible', true) 
              gt('travel', new BigDecimal(0)) 
             } 
             and { 
              eq('mileageEligible', true) 
              gt('mileage', new BigDecimal(0)) 
             } 
             and { 
              eq('expensesEligible', true) 
              gt('expenses', new BigDecimal(0)) 
             } 
            } 
           } 
          } 
    } 
    } 

Вещи: часы являются атрибутом из определенного класса, класс, который имеет этот именованный запрос. А ставки - это список, вложенный в один из вложенных объектов в моем конкретном классе. Когда я пытаюсь использовать его там, я получаю:

java.lang.IllegalArgumentException: object is not an instance of declaring class 

Как сослаться на часы атрибута с помощью этого имени запроса? Также еще один вопрос ... он вернет true, если есть какой-либо элемент в списке тарифов, который возвращает true для этого условия, правильно?

Это мой домен класс:

class TravelDetail { 

    Date date 
    Country country 
    BigDecimal hours 
    BigDecimal mileage 
    BigDecimal travel 
    BigDecimal expenses 

В стране у меня есть:

class Country { 

static hasMany = [rates: Rate 

И в курсе я:

class Rate { 

    Boolean hoursEligible = Boolean.TRUE 
     Boolean travelTimeEligible = Boolean.TRUE 
     Boolean mileageEligible = Boolean.TRUE 
     Boolean expensesEligible = Boolean.TRUE 
+0

показывать классы домена – injecteer

+0

@injecteer, добавлена ​​часть домена. – Igor

ответ

0

расколоть rate условия в каждом and, что-то например,

country { 
    and { 
     between('effectiveDate', startDate, endDate) 
     or { 
      and { 
       rates {eq('hoursEligible', true)} 
       gt('hours', new BigDecimal(0)) 
      } 
      . 
      . 
      and { 
       rates {eq('expensesEligible', true)} 
       gt('expenses', new BigDecimal(0)) 
      } 
     } 
    } 
} 
+1

Да, это то, что я сделал здесь, но похоже, что блок ставок возвращает true, только когда все из них верны для условия, которое я сделал, и мне нужно, чтобы это было правдой. Похоже, мне нужно сделать что-то вроде «rates.any». Без него он возвращает объект только тогда, когда все элементы верны. – Igor

+0

Попробуйте распечатать полученный запрос, чтобы иметь лучшую идею. –

+0

спасибо. забыл ответить здесь раньше ... но это помогло и решило мою проблему .. просто пришлось приложить некоторые изменения .. но мне пришлось несколько раз переходить в атрибут тарифов ... – Igor

0

Я не думаю, что я бы принять модель, как у вас, но, как правило, запрос должен выглядеть так (при условии, что вы называете это против TravelDetails):

def list = TravelDetail.withCriteria{ 
    between 'effectiveDate', startDate, endDate 
    or { 
    and { 
     country{ rates { eq 'hoursEligible', true } } 
     gt 'hours', 0 
    } 
    .... 
    } 
}