Поскольку второй запрос выбирает свойства не только Foo
, но и Bar
.Если вы println foo
, выходные данные для второго foo
будут выглядеть примерно так:
[Foo : 3, Bar : 2]
Если вы добавите loggingSql = true
в ваше определение dataSource
, Hibernate выведет фактический SQL, который он использует дляSTDOUT - что-то вроде:
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=?
ОК.Но как избежать возврата Bar
из запроса?- В настоящее время у меня нет хорошего решения.
Я бы проголосовал за использование предложения select с HQL , но на практике любой из этих синтаксисов приведет к ошибке в GORM.Возможно, решить эту проблему можно с помощью Hibernate Criteria
, но я в настоящее время не знаю, как.
Итак, для начала вы можете просто заявить:
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
РЕДАКТИРОВАТЬ: обратите внимание, что для однозначных ассоциаций может использоваться "точечный" синтаксис, т. Е.
from Foo foo where foo.baz.value=:value