2012-09-05 29 views
1

假設我們有3個域類:通過第三類相互關聯的2個類。Grails多對多有3個類:按關係數排序

好了,一些代碼:

class A { 
    String subject 
    String description 

    static hasMany = [cs: C] 

    static transients = ['numberOfCs'] 

    Long getNumberOfCs() { 
     return cs.size() 
    } 
} 

class B { 
    String title 
} 

class C { 
    A objectA 
    B objectB 

    static belongsTo = [a: A] 
} 

相當清楚了嗎?但願如此。這與我的域完美結合。

您可以看到transient屬性numberOfCs,它用於計算與我的A對象相關的C實例的數量。它工作得很好。

問題:列出所有我的A對象,我想按照與C對象的關係數排序它們,但瞬態屬性numberOfCs不能用於範圍。

我該如何處理這種情況?我該如何告訴GORM通過numberOfC對As列表進行排序,因爲它將是一個常規(非瞬態)字段?

在此先感謝。

回答

1

我不確定Grails的標準是否支持這一點,因爲您需要同時選擇A對象本身和由子對象聚合(C)。這意味着按照所有A的字段進行分組,這不是自動完成的。

如果您只需要從A某些字段,您可以將他們:

def instances = A.withCriteria { 
    projections { 
    groupProperty('subject') 
    count('cs', 'cCount') 
    } 
    order 'cCount' 
} 

否則你將需要檢索僅id S和進行第二次查詢,像in this question

另一種方法是使用derived properties等記載here(不知道它會工作雖然):

class A { 
    static mapping = { 
     numberOfCs formula: 'select count(*) from C where c.b_id = id' 
    } 
} 
+0

我會試試看,我會讓你知道,謝謝! – lucke84

+0

好吧,公式沒有爲我工作,我沒有嘗試withCriteria。但是我使用這個解決方案來檢索帶有2個分開的查詢的id,正如你在這個答案中指出的那樣,你鏈接了我。如果您編輯答案以使其更容易被人看到,我可以接受它。謝謝:) – lucke84

0

我不會考慮你的問題格姆相關,而是一般的休眠甚至SQL相關。

看看HQL Docu他們是很多例子。

檢查下面的HQL,這非常接近你問的東西。

select mySortedAs from A mySortedAs left join mySortedAs.cs myCsOfA order by    
count(myCsOfA) 

我覺得我看到的地方,你也可以做這樣的事情myCsOfA.length或myCsOfA.size

+0

謝謝,但我沒有問如何通過計算一個簡單的查詢來排序,但是如何對帶有瞬態字段的gsp列表結果進行排序。你的回答只是我尋找的一部分。查看Victor報告的鏈接,查看我應用的解決方案。 – lucke84

+1

答案是GORM/Hibernate不能做你所要求的。 Hibernate沒有意識到你的瞬態場,也不知道你的方法發生了什麼。 Hibernate只是一個ORM框架。關閉你可以得到的是1公式,2。右側查詢3.手動排序後檢索。 – Vadimo