Gorm返回值类型

时间:2010-11-16 16:08:02

标签: hibernate grails gorm

我有一个对象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。

1 个答案:

答案 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