2016-03-25 11 views
1

サブエンティティのプロパティによってGORM条件クエリフィルタリングを作成しようとしています。だから、そのような実体があります:ネストされたhasOneエンティティのGORMクエリ条件

class PaymentEntry { 

    static hasOne = [category: PaymentCategory] 

    static constraints = { 
    category(nullable: true) 
    } 

    // other stuff 
} 

class PaymentCategory { 

    static hasMany = [payments: PaymentEntry] 

    // other stuff 
} 

これで、特定のカテゴリのPaymentEntriesを選択しようとしています。ここ

def c = PaymentEntry.createCriteria() 

def res = c { 
    'in'("category", categories) 
} 

categoriesは、以前に選択PaymentCategoryエンティティのリストである:私はこのような何かをしようとしていました。

残念ながら、これは失敗します。 GrailsはNoSuchMethodExceptionをスローします。

+0

Grailsのバージョンはどれですか? –

答えて

1

あなたはinListを持っているはずです。 試してみてください:

def res = c { 
    inList("category", categories) 
} 
0

問題は数多くあります。 hasOneは1対1の意味で、associationsを意味しますが、実際には1対多を持っています。だから、最初のステップは、おそらくこのように、関連付けを修正することです:

class PaymentEntry { 

    static belongsTo = [category: PaymentCategory] 

    static constraints = { 
    category(nullable: true) 
    } 

    // other stuff 
} 

class PaymentCategory { 

    static hasMany = [payments: PaymentEntry] 

    // other stuff 
} 

次あなたが基準のインスタンスを持っていたら、あなたはあなたのクエリを作成し、実行するために、list()として、そのメソッドの1つを呼び出す必要があります。

def c = PaymentEntry.createCriteria() 

def res = c.list { 
    'in'("category", categories) 
} 

同じものである...

def res = PaymentEntry.withCriteria { 
    'in'("category", categories) 
} 

in()inList()両方の短いバージョンは、限り、あなたがやったとして、それがGroovyのキーワードなので、あなたが、inを引用として、あなたにご利用いただけます。条件照会の詳細についてはhereをご覧ください。

+0

しかし、私はPaymentCategoryに 'payments'フィールドを入れたくありません。それは本当に必要ですか? – amorfis

+0

私はそれを取得しません。あなたはすでにその財産を持っていました。 –