0

以下は私のドメインクラスです

class Sender {

String senderFname;
String senderLname;
String senderPhone;

Collection receivers

static hasMany = [receivers: Receiver]
}

class Receiver {

String receiverFname;
String receiverLname;
String receiverPhone;

    static belongsTo = [sender: Sender]
}

単純な検索機能のロジックを書いています。

def customers() {

    println 'customers params '+params
    //def senderCriteria = Sender.createCriteria()
    def senderList = Sender.withCriteria {

        if(params.senderfname)
            like('senderFname',params.senderfname)
        if(params.senderlname)
            like('senderLname',params.senderlname)          
        if(params.senderphone)
            like('senderPhone',params.senderphone)

        createAlias("receivers", "t")

        //receivers {
            if(params.receiverfname)
                like('t.receiverFname',params.receiverfname)
            if(params.recieverlname)
                like('t.receiverLname',params.receiverlname)
            if(params.recieverphone)
                like('t.receiverPhone',params.receiverphone)
        //}


    }

    println "senderList "+senderList;

    senderList.each{ it->  println 'sender '+it
        println 'receivers '+it.receivers

    }
    //senderList = senderList.unique()
    println "senderList "+senderList;
    render(view: 'customers', model: [senderList: senderList])

}

送信者から受信者への 1 対多の関係があります。送信者オブジェクトとそれに対応する受信者オブジェクトをフィルタリングしたい。

メインの createCriteria は、sender オブジェクトの期待される結果を返します。しかし、送信者オブジェクトにアクセスして対応する受信者を取得すると、データベースからすべての受信者が再度読み込まれます。

これに対処する方法はありますか。

4

1 に答える 1

1

createAliasのときに結合タイプを指定できます。

    createAlias("receivers", "t", org.hibernate.criterion.CriteriaSpecification.LEFT_JOIN)
于 2012-09-26T04:54:42.170 に答える