我有一个对象Foo,它与一个Bar对象的hasMany关联
class Foo {
String value
static hasMany = [
bars: Bar
]
}
class Bar {
String value
}
当我尝试下面的
时def foo = Foo.find("from Foo f where f.value=:value",[value:value])
返回值foo的类型是Foo,而当我这样做时
def foo = Foo.find("from Foo f left join f.bars b where b.value=:value",[value:value])
类型是对象
任何人都可以向我解释原因吗?
Thx,ken。
答案 0 :(得分:2)
因为第二个查询不仅会选择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 clause with 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
编辑:请注意,对于一对一关联,可以使用“dotty”语法,即
from Foo foo where foo.baz.value=:value