代码之家  ›  专栏  ›  技术社区  ›  ken

GORM返回值类型

  •  0
  • ken  · 技术社区  · 14 年前

    我有一个对象foo,它与一个bar对象有很多关联

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

    类型是对象

    有人能告诉我为什么吗?

    谢谢,肯。

    1 回复  |  直到 14 年前
        1
  •  2
  •   robbbert    14 年前

    因为第二个查询选择的属性不仅仅是 Foo 而且 Bar . 如果你 println foo ,第二个输出 foo 是这样的:

    [Foo : 3, Bar : 2]
    

    如果添加 loggingSql = true 对你 dataSource 定义,Hibernate将输出它用于stdout的实际SQL,如下所示:

    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=?
    

    好啊。但如何避免返回 酒吧 从查询中?-我现在没有一个好的解决方案。

    我投票赞成使用 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
    
    推荐文章