2016-06-21 1 views
0

タイトルは質問自体を話す動作しません。私はこのGrails Domainクラスを持っています。休止どこかのステートメントは、

class IonicBond { 
    ... 

    static hasMany = [ 
     typeIIs: TypeII, 
     typeRs: TypeR, 
    ] 

    static constraints = { 
     typeIIs nullable: true 
     typeRs nullable: true 
    } 
} 

私はそれのhasMany特性に基づくIonicBondのインスタンスを照会する必要があります。このような何か:

ArrayList<IonicBond> list = IonicBond.createCriteria().list { 
    or { 
     typeIIs { 
      eq("classCode", "WD996") 
     } 
     typeRs { 
      eq("classCode", "WD996") 
     } 
    } 
} 

私はこの文のクエリ何かをする必要があります:「そのTypeII子供やTypeR子供のclassCodeのいずれかが 『WD996』に等しいすべてのIonicBondを取得します」。問題はIonicBondインスタンスが両方TypeIITypeR子供を持っている場合は、このクエリはのみ動作するということです。 「WD996」のclass値と

  1. IonicBondTypeRを持つ子供をしかし、何のTypeII子供を持っていない:それは含まれません。
  2. IonicBondTypeIIclassの値が "WD996"の子ではありませんが、TypeRの子はありません。私は、結果セットにこれを含めることができますどのよう

+0

'typeIIs'クロージャで' isNull( 'typeRs') 'を追加し、' typeRs'で 'isNull( 'typeIIs')'を追加する必要があります。 – dmahapatro

答えて

0

私はcreateCriteria()それは本当にだけtypeIIs子供、またはtypeRsを持ってIonicBondインスタンスのみの両方を含んでいないだろうという意味、デフォルトでINNER JOINを使用していることが分かりました。デフォルトでは、参加するようHibernateはあなたがconstraints.nullable: trueにその子のすべてを設定した場合でも、LEFT JOINを使用しないこと

import org.hibernate.Criteria 

... 
    ArrayList<IonicBond> list = IonicBond.createCriteria().list { 
     createAlias('typeIIs', 'typeIIs', Criteria.LEFT_JOIN) 
     createAlias('typeRs', 'typeRs', Criteria.LEFT_JOIN) 

     or { 
      eq("typeIIs.classCode", "WD996") 
      eq("typeRs.classCode", "WD996") 
     } 
    } 

注:ソリューションはcreateAlias()を使用してLEFT JOINにそれを変更することです。手動で記述する必要があります。

1

このソリューションをお試しください:

ArrayList<IonicBond> list = IonicBond.where { typeRs { classCode == "WD996" } || typeIIs { classCode == "WD996" } }.list() 
0

独立基準がGORMを照会する一つの方法です。最初に、クエリを実行するドメインクラスの名前を持つDetachedCriteriaを作成します。次に、 'where'クエリまたは条件クエリを使用して 'build'メソッドを呼び出します。

def criteria = new DetachedCriteria(IonicBond).build { 

    or { 
      typeIIs { 
       eq("classCode", "WD996") 
      } 
      typeRs { 
       eq("classCode", "WD996") 
      } 
     } 

} 
def result = criteria.list() 
+1

このコードが質問にどのように答えているかを詳しく教えてください。 – JAL

+0

ええ、 'build'クロージャは何ですか? – Gideon