GORM按has_many排序

时间:2012-06-13 16:28:14

标签: grails groovy gorm

这是在Grails和GORM的背景下

如果域A有很多域B,而域B有一个名为name的字段是字符串,那么生成A列表的最佳方法是什么,该列表已根据其“最佳”值B进行排序。因此,例如,如果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])

1 个答案:

答案 0 :(得分: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,然后查看stdout打印的位置,然后您就会看到:

Andrew
Brandon
Cathy
Lisa
Walter

可能有一些更好的方法可以做到这一点的某些部分,但这是我能想到的最重要的......