在对我的应用程序的请求中,我经常得到对象的id,这些对象应该关联。但是我必须检查它们是否存在。
示例场景: A类和B类相关联:
A {
static hasMany = [bs: B]
}
根据我的要求,我会得到援助和出价。 我通常做的是:
def a = A.get(aid)
def b = a.bs.find {it.id == bid}
进行此检查的更好方法是什么?从绩效角度来看?
由于
答案 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的解决方案相同,但实际上它会加载对象。