2010-11-16 7 views
0

J'ai un objet Foo avec une association hasMany à un objet BarGorm retourné type de valeur

class Foo { 
String value 
static hasMany = [ 
    bars: Bar 
] 
} 

class Bar { 
String value 
} 

lorsque je tente le follwing

def foo = Foo.find("from Foo f where f.value=:value",[value:value]) 

le type de la valeur retournée foo est Foo, alors que quand je fais ce

def foo = Foo.find("from Foo f left join f.bars b where b.value=:value",[value:value]) 

le type est un objet

Quelqu'un peut-il m'expliquer pourquoi?

Thx, ken.

Répondre

2

Parce que la deuxième requête sélectionne non seulement les propriétés Foo mais également Bar. Si vous println foo, la sortie pour la deuxième foo est quelque chose comme ceci:

[Foo : 3, Bar : 2] 

Si vous ajoutez loggingSql = true à votre définition dataSource, Hibernate sortie SQL réelle qu'il utilise pour STDOUT - quelque chose comme:

select 
    foo0_.id as id0_0_, 
    bar2_.id as id2_1_, 
    foo0_.version as version0_0_, 
    foo0_.value as value0_0_, 
    bar2_.version as version2_1_, 
    bar2_.value as value2_1_ 
from 
    foo foo0_ 
left outer join 
    foo_bar bars1_ 
     on foo0_.id=bars1_.foo_bars_id 
left outer join 
    bar bar2_ 
     on bars1_.bar_id=bar2_.id 
where 
    bar2_.value=? 

OK. Mais comment éviter de renvoyer le Bar de la requête? - Je n'ai actuellement pas de bonne solution.

Je voterais pour utiliser le select clause with HQL, mais en pratique, l'une de ces syntaxes produira une erreur dans GORM. Il peut être possible de résoudre cela en utilisant un Hibernate Criteria, mais je ne sais pas comment.

Alors, pour commencer, vous pourriez simplement vouloir indiquer:

def fooBar = Foo.find("from Foo f left join f.bars b where b.value=:value", 
    [value:value]) 
def foo = fooBar[0] 
assert foo instanceof Foo 

EDIT: Notez que pour un à-un de la syntaxe "Dotty" peut être utilisé, par exemple,

from Foo foo where foo.baz.value=:value