Вопрос по join, hql, grails, groovy – HQL присоединяется к Grails: Part Deux

1

Это расширение вопроса, который я задалВот

У меня такие отношения

class Foo {
    static hasMany = [bars: Bar]
}

class Bar {
    // Has nothing to tie it back to Foo or Thing
}

class Thing {
    static hasMany = [bars: Bar]
}

У меня есть экземплярThing. I want to get all instances of Foo that are associated with all instances of Bar that are associated with the instance of Thing that I have.

Это то, что я хочу, возможно через HQL (HQL каким-то образом осознает косвенную связь междуThing а такжеFoo)?

UPDATE:

Вот картина возможных отношений.

enter image description here

Если бы у меня былоThing1 и я хотел, чтобы всеFoo которые косвенно связаны с этим черезBar тогда решение, которое мне нужно, вернетсяFoo1 а такжеFoo2

@ Baz1nga Обновил мой вопрос с графической поддержкой ubiquibacon
Что вы подразумеваете подassociated with all instances of bar? Baz1nga
Я обновил свой ответ, потому что ваш вопрос на самом деле проще, чем был изначально. JB Nizet

Ваш Ответ

2   ответа
3

select foo from Foo foo
where not exists (select thingBar.id from Thing thing left join thing.bars thingBar
                  where thing.id = :thingId
                  and thingBar.id not in (select fooBar.id from Foo foo2
                                          left join foo2.bars fooBar
                                          where foo2.id = foo.id))

РЕДАКТИРОВАТЬ: Теперь, когда вы объяснили, что вы хотели, с хорошей картинкой, это стало проще. На самом деле вы хотите, чтобы все Foos были связаны сat least one Бар (и не все бары) также связан с Thing. Таким образом, запрос будет:

select foo from Foo foo
inner join foo.bars fooBar
where fooBar.id in (select thingBar.id from Thing thing inner join thing.bars thingBar)
Это лучшее, что я могу сделать. Может быть, существует что-то более простое, но я не знаю что.
Ничего себе, это противно :) Есть ли что-то, что я могу сделать (belongsTo или какое-либо другое определение отношений), которое уменьшило бы многословность этого запроса? ubiquibacon
0

Foo.withCriteria {
    bars {
        in('id', thing.bars.collect { it.id })
    }
}

Похожие вопросы