Мое первое желание - перейти на HQL и использовать count (), чтобы увидеть, существует ли он. Могут быть более изящные способы достижения того же самого (возможно, с использованием критерия), но мой первый взлом на это выглядит так:
def result = A.executeQuery("select count(*) from A as a inner join a.bs as b where a.id=:aid and b.id=:bid", [aid: aid, bid: bid] )
def associated = result[0] > 0
Я думаю, это было бы довольно эффективно, хотя в любое время, когда вы смотрите на повышение производительности, лучше всего проводить измерения различных реализаций, чтобы вы могли сравнить их для себя. Я оставлю это как упражнение для читателя. ; -)
РЕДАКТИРОВАТЬ: я думаю, что это эффективно, потому что я оставил тяжелую работу в базе данных вместо того, чтобы тянуть данные для экземпляров A и B по сети, создавая экземпляры в памяти или просматривая результаты.