2010-04-24 76 views
1

我有2個領域類如何計算在1 ocurrences在GORM多對多關係 - Grails的

class A { 
    .... 
    static hasMany = [bs:B] 
} 
class B { 
    int code 
    .... 
} 

我怎麼能在所有的表格列出B中的所有代碼ocurrences多少?

喜歡的東西

b.each { thisb -> 
    int ocurrences = A.bs.findAll{it == thisb}.size() 
    ... 
} 

感謝

+0

我不知道我理解的題。你想計算每個B所屬的數量? – 2010-04-25 01:04:41

+0

感謝您的回覆;我想知道B中有多少次B存在。 – xain 2010-04-25 01:39:03

回答

2

我認爲我有點困惑的這個問題的原因是,在技術上它實際上是一個多一對多的關係,不是一個真正的單太多。 Grails將爲這個關係創建一個連接表(「a_b」)(因爲B與A沒有belongsTo關係)。

您的A域構建hasMany關係的方式是一個集合,因此B只會在「bs」集合中顯示一次。所以,我相信,所有你問的是有多少如同有一個B.

如果這是真的,你可以使用HQL來回答你的問題(你也可以使用條件構建器,但我更喜歡hql)。下面是一個例子(使用編譯 - 測試數據的插件來構建與buildLazy對象,並添加一個字符串名來A):在

def a1 = A.buildLazy(name: "one") 
def a2 = A.buildLazy(name: "two") 
def a3 = A.buildLazy(name: "three") 
def a4 = A.buildLazy(name: "four") 

def b1 = B.buildLazy(code: 888) 
def b2 = B.buildLazy(code: 999) 

a1.addToBs(b1) 
a2.addToBs(b1) 
a3.addToBs(b1) 
a4.addToBs(b1) 

a1.addToBs(b2) 

println "Number of As that have each B = " + 
    A.executeQuery("select count(b), b.code from A as a join a.bs as b group by b.code") 

println "Number of As with a specific B = " + 
    A.executeQuery("select count(*) from A as a join a.bs as b where b = :b", [b: b1]) 

結果:

Number of As that have each B = [[1, 999], [4, 888]] 
Number of As with a specific B = [4] 
+1

其實不,這是一對多;如果每個A都有一個給定的B,那麼最多可以有A中的行數。我已經通過幾個「每個」循環實現了它,我想知道的是如果有這樣做的GORMy方法(與.findBy *,.count *等)。 – xain 2010-04-25 15:41:24

+0

@Xain從技術上說,沒有什麼限制一對多......你當然可以創建許多B,並讓它們都成爲你創建的每一個A的孩子。要限制它,你需要在B中添加一個belongsTo行。 – billjamesdev 2010-04-25 16:37:56

+0

沒錯,沒有belongsTo,生成的db模型有一個連接表。即使你從邏輯的角度限制它,它確實是一個沒有belongsTo的多到多。我並不是說你把它看作是錯的。如果B是一個「代碼」表,並且A可以有許多B,那麼這是將它建模爲不具有冗餘B的正確方法。 你不能使用動態查找器(findBy *,countBy *等),你必須使用上面使用的條件或hql。他們不會跨越許多關係。 – 2010-04-26 00:01:09