4

したがって、以下のように互いに hasMany 関係にあるドメイン内にいくつかのオブジェクトがあります

Class Car {
    String name
    SortedSet tires = [] as SortedSet
    static hasMany = [tires: Tire]
}

Class Tire {
    String type
    SortedSet screws = [] as SortedSet
    static hasMany = [screws: Screw]
}

Class Screws {
     String type
}

ここで、findByName で取得できる特定の種類の車のオブジェクト ツリー全体をオフラインにしたいと考えています。ファインダーでフェッチ エイジャーを実行できることはわかっていますが、それは 1 レベルだけ下がります。例のように、2 レベル以上あります。

だから私の質問はこれです。オブジェクト ツリー全体を熱心にフェッチし、grails/Hibernate が別のクエリを起動して詳細をフェッチすることなく、それを使用するエレガントなソリューションはありますか。

同様の結果が得られるように見える次のことを試しましたが、エレガントではありません。

withCriteria ソリューション

def cars = Car.withCriteria {
    tires {
        screws {
            join 'screws'
        }
    }

また、ツリー全体を JSON に変換して再解析しようとしましたが、それはやり過ぎのようです。基本的に、オブジェクト ツリー全体をオフラインにしようとしていると思います。これが簡単に、またはまったく実行できるかどうか、何か考えはありますか?

ティア

4

1 に答える 1

4

マッピング クロージャの使用:

Class Car {
    String name
    SortedSet tires = [] as SortedSet
    static hasMany = [tires: Tire]
    static mapping = {
        tires lazy: false
    }
}

Class Tire {
    String type
    SortedSet screws = [] as SortedSet
    static hasMany = [screws: Screw]
    static mapping = {
        screws lazy: false
    }
}

Class Screws {
     String type
}

たぶん、ルールのような例外を取る必要があります。つまり、ドメイン クラスをlazy: falsefetch lazy で呼び出すように構成し、ファインダーを呼び出すことができます。

def cars = Car.findAllByType(type: "Alfa", [fetch: [tires: 'lazy']])

それが有効なオプションかどうかはわかりませんが、試してみてください。

于 2012-08-26T23:36:57.807 に答える