2011-08-05 15 views
6

1対多リレーションシップの一部である2つのドメインがあります。私は親のFKのために子供をどのように問い合わせることができるのだろうと思っていたのですか?ベローは、親/子のための擬似コードであるGrails、外部キーによるレコードの検索方法

親:

class AlumProfile { 
String firstName 
String lastName 
    static hasMany = [alumLanguage : AlumLanguage] 


static mapping = { 
    cache true 
    id generator: 'assigned' 

    columns { 
     firstName type:'text' 
     lastName type:'text' 
    } 

    // 
} 
static constraints = { 
    firstName (nullable:true) 
    lastName (nullable:true) 
    } 

    } 

子供:

class AlumLanguage { 
String name 
String level 

static belongsTo = [alumProfile:AlumProfile] 
static mapping = { 
    cache true 

    columns { 
     name type:'text' 
     level type:'text' 
    } 
} 
static constraints = { 
    name(nullable:true) 
    level(nullable:true) 
} 
    } 

私は明示的にFKを作成しませんが、Grailsのは、MySQL DBを作成するの面倒を見ますそのままで。しかし、私はこのようなFKで子供を照会したい場合:

if(AlumLanguage.findByNameAndAlumProfileId(language.'language'.toString(), 'jIi-hRi4cI')==null){ 
     //do something 
} 

私はエラーを取得していない:名前が見つかりませプロパティを[alumProfileId]クラスの[クラスmgr.AlumLanguage]

上の任意の提案これを達成する方法は?

おかげ ジェイソン

答えて

7

criteriaを使用してみてください:

def c = AlumLanguage.createCriteria() 
def languages = c.get { 
    eq('name', 'whatever-language') 
    alumProfile { 
     eq('id', 'jIi-hRi4cI') 
    } 
} 
+0

これはリストを返します。私はAlumLanguagesオブジェクトを返さなければならないので、そのインスタンスを編集/削除することができます – jason

+0

更新されました。しかし、そうするつもりなら、AlumProfile.alumLanguageを一意のメンバーを強制するための 'Set'として宣言したいと思うかもしれません。 –

+0

ありがとうございました!好奇心の中で、 "AlumProfile.alumLanguageをSetとして宣言する"ことは何を意味しますか?再度、感謝します! – jason

関連する問題