我有一个对象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])
类型是一个对象
谁能向我解释为什么?
谢谢,肯。
最佳答案
因为第二个查询选择的属性不仅是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
编辑:请注意,对于一对一关联,可以使用“点”语法,即
from Foo foo where foo.baz.value=:value
关于hibernate - Gorm返回值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4196212/