2010-04-24 4 views
1

을 나는이 두 도메인 클래스어떻게 GORM 많은 관계로 하나의 발생 회수를 계산하기 - Grails의

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

나는 테이블 모두에 B의 모든 코드의 발생 회수의 수를 나열 할 수 있는가?

뭔가

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

감사

+0

나는 내가 이해 확실하지 않다 다음은 그 예 (buildLazy와 객체를 구성하는 빌드 테스트 데이터 플러그인을 사용하여 A와 문자열 이름을 추가)입니다 문제. 각 B가 속한 As의 수를 계산 하시겠습니까? –

+0

답장을 보내 주셔서 감사합니다. A에 B가 몇 번 있었는지 알고 싶습니다. 모든 Bs에 해당합니다. – xain

답변

2
나는이 질문에 의해 혼란 조금 해요 이유는 기술적으로 정말 실제로는 단색 대다 관계, 아니라고 생각

다 대다. Grails는이 관계에 대한 조인 테이블 ("a_b")을 만듭니다 (B는 A에 대한 belongsTo 관계가 없기 때문에).

A 도메인을 생성하는 방식으로 hasMany 관계가 설정되므로 B는 "bs"컬렉션에만 한 번만 나타납니다. 그래서, 당신이 묻는 것은 모두 As가 B를 가지고 얼마나 많은지입니다.

사실이라면 HQL을 사용하여 질문에 대답 할 수 있습니다 (기준 작성자를 사용할 수도 있지만 hql을 선호합니다). 에

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

사실, 아니오, 1 대 다수입니다. 모든 A에 주어진 B가 있다고 가정 할 때 B의 A에있는 행의 수는 최대로있을 수 있습니다. 이미 두 개의 "각"루프로 구현했습니다.이 작업을 수행하는 GORMY 방법이있는 경우 알고 싶습니다. .findBy *, .count * 등). – xain

+0

@Xain 기술적으로이 것을 One To Many ...로 제한하는 것은 없습니다. 많은 Bs를 만들 수 있으며, 모든 Bs의 모든 자식을 가질 수 있습니다. 이를 제한하기 위해서는 B에 belongsTo 행을 추가해야합니다. – billjamesdev

+0

오른쪽으로 belongsTo가 없으면 생성 된 db 모델에 조인 테이블이 있습니다. 비록 당신이 논리적 관점에서 그것을 제한하고있다하더라도, 그것은 실제로 belongsTo없이 많은 것입니다. 나는 당신이 틀렸다고 말하는 것이 아닙니다. B가 "코드"테이블이고 A가 여러 Bs를 가질 수있는 경우 중복 된 Bs가없는 모델을 만드는 올바른 방법입니다. 동적 찾기 (findBy *, countBy * 등)를 사용하여 수행 할 수 없으므로 위에 사용 된 기준 또는 hql을 사용해야합니다. 그들은 hasMany 관계에서 작동하지 않습니다. –

관련 문제