如何检查对象是否在Domain对象的集合中?

时间:2011-11-05 09:30:46

标签: grails associations gorm

在对我的应用程序的请求中,我经常得到对象的id,这些对象应该关联。但是我必须检查它们是否存在。

示例场景: A类和B类相关联:

A {
    static hasMany = [bs: B]
}

根据我的要求,我会得到援助和出价。 我通常做的是:

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

进行此检查的更好方法是什么?从绩效角度来看?

由于

2 个答案:

答案 0 :(得分:0)

我的第一个倾向是放弃HQL并使用count()来查看它是否存在。可能有更优雅的方式来实现相同的东西(也许使用withCriteria)但我的第一个裂缝看起来像:

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的实例提取数据,在内存中创建实例,或者迭代结果。

答案 1 :(得分:0)

如果B在其中定义了belongsTo = [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
}

这不会像代码那样对所有集合元素进行迭代。基本上,它与erturne的解决方案相同,但实际上它会加载对象。