2012-06-13 63 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