Как посчитать вхождения в отношения 1 ко многим в gorm - grails - PullRequest
1 голос
/ 24 апреля 2010

У меня есть 2 класса домена

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

Как я могу перечислить количество вхождений всех кодов в B во всей таблице A?

Что-то вроде

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

Спасибо

1 Ответ

2 голосов
/ 25 апреля 2010

Я думаю, что причина, по которой меня немного смущает этот вопрос, заключается в том, что технически это отношения «многие ко многим», а не «один ко многим». Grails создаст таблицу соединений («a_b») для этого отношения (поскольку B не имеет отношения отношение к A).

То, как вы создали свой домен A, отношение hasMany - это набор, поэтому B будет отображаться только один раз в коллекции "bs". Итак, я полагаю, все, что вы спрашиваете, сколько у вас есть Б.

Если это так, вы можете использовать HQL для ответа на ваш вопрос (вы также можете использовать построители критериев, но я предпочитаю hql). Вот пример (использование плагина build-test-data для создания объектов с помощью 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]
...