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