【问题标题】:GORM sort by a has_manyGORM 按 has_many 排序
【发布时间】:2012-06-13 16:28:14
【问题描述】:

这是在 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])

【问题讨论】:

    标签: grails groovy grails-orm


    【解决方案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
    

    可能有一些更好的方法来完成其中的某些部分,但这是我能想到的...

    【讨论】:

    • 谢谢,但这不会产生 ClassB 的列表吗?我正在寻找 ClassA 的列表,但根据其最佳排名 bList 成员进行排序。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2012-06-12
    • 2013-11-22
    • 2011-06-27
    • 2016-04-29
    相关资源
    最近更新 更多