hibernate - Gorm返回值类型

标签 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])

类型是一个对象

谁能向我解释为什么?

谢谢,肯。

最佳答案

因为第二个查询选择的属性不仅是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/

相关文章:

hibernate - 如何将持久性单元的 JPA EntityManagerFactory 设置为不为 'default'

java - 我如何使用 spring Autowiring 使用内存中的 derby 数据库来使用一堆 DAO?

java - 在 hql 中将结果集从 int 转换为 boolean

javascript - 使用jQuery根据文本详细信息对div排序

grails - Grails GORM有条件的左外部联接

hibernate - Spring Data + Hibernate 5 (Spring Boot 1.4) - 获取弃用消息

java - Tomcat 上的 Grails 应用程序密码保护文件

scala - Groovy Grails 或 Scala Play

grails - 使用Grails分配域类ID异常

hibernate - 如何在不使用inList闭包的情况下使用GORM获取表B中不存在的表A行?