1

これは Grails と GORM のコンテキストにあります。

ドメイン A にドメイン B の多くがあり、ドメイン B に文字列である name というフィールドがある場合、B の「最良の」値に基づいてソートされた A のリストを生成する最も適切な方法は何ですか。たとえば、 A のインスタンスに「Andrew」と「Zed」という名前の B がある場合、「Jim」と「Fred」という名前の B を持つ A の前に配置する必要があります。

これは私が持っているもので、もう少しGrails-yのものを探しています:

def apps = B.executeQuery("select distinct c from A as c left join fetch c.bs as b order by b.name",[max:pmax, offset:poffset])
4

1 に答える 1

1

通常、SQL クエリを直接実行することはなく、GORM を使用してそれらを処理します。

ドメイン クラスを双方向の関連付け (一方向の関連付けはサポートされていません) として設定できる場合は、次のようにすることができます。

class classA {

    static constraints = {
    }

    static mapping = {
        bList sort :'name', order:'asc'
    }

    static hasMany = [bList: classB]
}

そして今クラスB:

class ClassB {

    static constraints = {
    }

    static belongsTo = [classAInstance: classA]

    String name
}

これをBootStrap.groovyファイルに追加して、いくつかのインスタンスを追加しました。

class BootStrap {

    def init = { servletContext ->
        def a = new ClassA()
        def b1 = new ClassB(name: 'Andrew')
        def b2 = new ClassB(name: 'Lisa')
        def b3 = new ClassB(name: 'Walter')
        def b4 = new ClassB(name: 'Brandon')
        def b5 = new ClassB(name: 'Cathy')

        a.addToBList(b1)
        a.addToBList(b2)
        a.addToBList(b3)
        a.addToBList(b4)
        a.addToBList(b5)
        a.save()
    }

    def destroy = {
    }
}

次に、これは私がテストに使用したコントローラーです。

class TestController {

    def index() {
        def aInstance = ClassA.get(1)
        def lst = aInstance.bList

        lst.each { println it.name }
    }
}

http://localhost:8080/test/test/indexstdout が印刷された場所に移動して確認できるはずです。

Andrew
Brandon
Cathy
Lisa
Walter

これの特定の部分を行うためのより良い方法がいくつかあるかもしれませんが、これは私が頭のてっぺんから考えることができるものです...

于 2012-06-14T03:27:44.597 に答える