2016-11-07 13 views
1

私はこのような状況を持っている:GrailsでCriteriaのクラスの属性と一緒にネストされた属性を使用するには?

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)) 
             } 
            } 
           } 
          } 
    } 
    } 

事がある:時間は、特定のクラスから属性、この名前付きクエリを持つクラスです。そしてratesは、特定のクラスのネストされたオブジェクトの1つにネストされたリストです。私はそこにそれを使用しようとすると 私が取得しています:

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

は、どのように私はこの名前付きクエリを使用して、時間属性を参照しますか? さらにもう1つの質問...この条件で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

は、すべてのandで何かをrate条件を分割このように、

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

ええ、それは私がここでやったことですが、レートブロックが真実を返すように思えるのは、私が作った条件のためにリストのすべてが真であるときだけで、それが真実である必要があるときです。私は "rates.any"のようなことをする必要があるようです。それがなければ、すべての項目が真であるときだけオブジェクトを返します。 – Igor

+0

結果のクエリを印刷して、より良いアイデアを得てください。 –

+0

ありがとうございます。前にここに答えるのを忘れてしまった...しかし、それは私の問題を助け、解決しました。ちょうどいくつかの変更を適用しなければなりませんでした。しかし、私は一度以上rate属性に反復しなければなりませんでした... – Igor

0

私はあなたのようなモデルを採用することを、考えていませんが、一般的にクエリは、(あなたがTravelDetailsに対してそれを呼び出す提供)のようになります。

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