2009-09-17 11 views
3

Mon application Grails a les objets suivants domainerequêtes désireux de chargement avec Gorm/Mise en veille prolongée

class ProductType { 
    String name 
    static hasMany = [attributes: Attribute] 
} 

class Attribute {  
    String name 
    static belongsTo = [productType: ProductType] 
} 

Mon DB a 7 ProductType s et chacun de ces 3 a Attribute s. Si j'exécute la requête:

def results = ProductType.withCriteria { 
    fetchMode("attributes", org.hibernate.FetchMode.EAGER) 
} 

Je me attends 7 cas de ProductType à retourner, mais en fait je reçois 21 (7 x 3). Je comprends que si je devais exécuter un équivalent requête SQL à ce qui précède, l'ensemble des résultats aurait 21 lignes

prod1 | attr1 
prod1 | attr2 
prod1 | attr3 
..... | ..... 
..... | ..... 
prod7 | attr1 
prod7 | attr2 
prod7 | attr3 
------------- 
Total 21 

Mais je pensais que lorsque je récupère ces résultats via Hibernate/GORM je devrais obtenir quelque chose comme:

prod1 | attr1, attr2, attr3  
..... | ................... 
..... | ................... 
prod7 | attr1, attr2, attr3 
--------------------------- 
Total 7 

Soit dit en passant, si je retire l'envie de chargement de la requête ci-dessus, je reçois 7 ProductType s comme prévu. Qu'est-ce que je rate?

+0

J'ai remarqué moi-même, mais était de retour quand j'utilisais Grails 1.0.4, pouvez-vous spécifier la version de Grails que vous utilisez? – billjamesdev

+0

J'utilise la version 1.1.1 –

Répondre

4

vous devriez lire ce faq: Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?

Lorsque vous spécifiez le chargement pressé, le ResultSet contient, comme vous avez remarqué, 7 * 3 rangs mais en fait vous avez seulement 7 objets productTypes en mémoire (& 2 références supplémentaires pour chacun) .
Pour faire ce que vous voulez, vous pouvez ajouter (savoir que la requête SQL sous-jacente n'a pas changé):

SetResultTransformer(new DistinctRootEntityResultTransformer())

def results = ProductType.withCriteria { 
    fetchMode("attributes", org.hibernate.FetchMode.EAGER) 
    SetResultTransformer(new DistinctRootEntityResultTransformer()) 
} 
+0

content que ça aide, merci. – manji

Questions connexes