2012-06-13 107 views
1

这是Grails和格姆GORM排序由的has_many

的情况下如果域A有许多域B,而域B有一个字段名为name这是一个字符串,什么是生产最巧妙的方法一个已经根据B的“最佳”值排序的A的列表。例如,如果A的一个实例具有名称为“Andrew”和“Zed”的B,则它应该出现在名称为“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

我通常不直接执行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再看看以往标准输出打印的地方,然后你shoue看到:

Andrew 
Brandon 
Cathy 
Lisa 
Walter 

可能有一些更好的方法来做这个的某些部分,但这是我可以想到的我的头顶...

+0

谢谢,但不会产生一个ClassB的列表?我正在查找ClassA的列表,但是根据其最佳排名bList成员进行排序。 – buchan