Как проверить, находится ли объект в коллекции объекта Domain? - PullRequest
0 голосов
/ 05 ноября 2011

В запросах к моему приложению я часто получаю идентификаторы объектов, которые должны быть связаны.Однако я должен выполнить проверку, чтобы убедиться, что они есть.

Пример сценария: Класс A и B связаны:

A {
    static hasMany = [bs: B]
}

В моем запросе я получу помощь и предложение.Я обычно делаю следующее:

def a = A.get(aid)
def b = a.bs.find {it.id == bid}

Что может быть лучше для проверки?С точки зрения производительности?

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 ноября 2011

Если в B определено значение ProperTo = [a: A], то вы можете сделать это:

def a = A.get(aid)
def b = B.find("from B as b where b.id=:id and b.a = :a", [id:bid, a:a])
if (b) {
   // b exists -- do something with it here
} else {
   // uh oh! b isn't within a
}

Это не будет выполнять итерацию по всем элементам множеств, таким как ваш код. По сути, это то же самое, что и решение Эртурна, но оно фактически загружает объект.

0 голосов
/ 05 ноября 2011

Мое первое желание - перейти на 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 по сети, создавая экземпляры в памяти или просматривая результаты.

...