2010-04-24 5 views
1

je 2 classes de domaineComment compter ocurrences en 1 à plusieurs dans Gorm - Grails

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

Comment puis-je énumérer le nombre de ocurrences de tous les codes en B dans toute la Une table?

Quelque chose comme

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

Merci

+0

Je ne suis pas sûr que je comprends la question. Vous voulez compter le nombre de A auquel appartient chaque B? –

+0

Merci pour votre réponse; Je veux savoir combien de fois un B est présent dans A. Ceci pour tous les Bs. – xain

Répondre

2

Je pense que la raison pour laquelle je suis un peu confus par cette question est que, techniquement, il est en fait un grand nombre à plusieurs, pas vraiment de un trop. Grails crée une table de jointure ("a_b") pour cette relation (car B n'a pas de relation belongsTo avec A).

La façon dont vous avez construit votre domaine A La relation hasMany est un ensemble, donc B n'apparaîtra qu'une seule fois dans la collection "bs". Donc, je crois, tout ce que vous demandez est combien ont un B.

Si c'est vrai, vous pouvez utiliser HQL pour répondre à votre question (vous pouvez également utiliser des générateurs de critères, mais je préfère hql). Voici un exemple (en utilisant le plug-in build-test des données pour construire des objets avec buildLazy et en ajoutant un nom de chaîne à 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]) 

résultats dans:

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

En fait non, c'est un à plusieurs; Il peut y avoir au plus le nombre de lignes dans A de Bs en supposant que chaque A a un B. Je l'ai déjà implémenté avec deux "each" boucles, ce que je voulais savoir, c'est s'il y a un moyen GORMy de le faire (avec .findBy *, .count *, etc). – xain

+0

@Xain techniquement, il n'y a rien qui limite cela à One To Many ... vous pouvez certainement créer beaucoup de Bs et les avoir tous les enfants de chaque A que vous créez. Pour le restreindre, vous devez ajouter une ligne belongsTo dans B. – billjamesdev

+0

À droite, sans un belongsTo, le modèle db généré est doté d'une table de jointure. Même si vous le limitez d'un point de vue logique, c'est vraiment beaucoup à beaucoup sans appartient. Je ne dis pas que vous l'avez modélisé. Si B est une table "code" et A peut avoir plusieurs Bs, c'est la bonne façon de le modéliser pour ne pas avoir de Bs redondants. Vous ne pouvez pas le faire avec les finders dynamiques (findBy *, countBy *, etc), vous devrez utiliser un critère ou hql comme je l'ai utilisé ci-dessus. Ils ne fonctionnent pas à travers de nombreuses relations. –