1

这是在 Grails 和 GORM 的上下文中

如果域 A 有许多域 B,并且域 B 有一个名为 name 的字段,它是一个字符串,那么生成 A 列表的最简洁方法是什么,该列表已根据 B 的“最佳”值进行排序。例如如果 A 的一个实例具有 B 的名称为“Andrew”和“Zed”,那么它应该出现在 B 的名称为“Jim”和“Fred”的 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/index然后查看打印标准输出的位置,然后您应该看到:

Andrew
Brandon
Cathy
Lisa
Walter

可能有一些更好的方法来做这件事的某些部分,但这是我能想到的……

于 2012-06-14T03:27:44.597 回答