Gorm тип возвращаемого значения - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть объект Foo с ассоциацией hasMany с объектом 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])

типом является объект

Может кто-нибудь объяснить мне, почему?

Thx, кен.

1 Ответ

2 голосов
/ 16 ноября 2010

Поскольку второй запрос выбирает свойства не только 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 с 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
...