2011-11-05 147 views
0

在我的应用程序的请求中,我经常获得应该关联的对象的ID。不过,我必须执行检查,看看他们是否。如何检查对象是否在Domain对象的集合中?

示例方案: A类和B相关:

A { 
    static hasMany = [bs: B] 
} 

在我的请求,我将得到援助和竞价。 我最常做的是:

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

什么会是一个更好的办法,使这个检查?从性能角度来看?

感谢

回答

0

如果B有一个属于关联= [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的解决方案相同,但实际上加载了该对象。

+0

谢谢托德。我尽力避免双向联想。这主要是由于它在大多数情况下会是多对多的,而我只需要一种方式。但在两种情况下,这似乎是一个好主意。如果b.idA ==有帮助,那么执行B.get(bid)可能会更快,并执行检查[在需要时不需要抓取A就可以完成)。 – Krystian

+0

这就是grails的美妙之处,有十几种方法可以处理任何事情!我的建议是,用最简单,最简单的方式阅读代码,只有在发现实际性能问题时才对其进行优化。使用分析工具可以帮助找到真正的问题点,并且优化后的代码通常不太容易理解,所以我只是触及导致最多延迟的区域,以使我的代码更易于维护。 – Todd

0

我的第一个倾向是下降到HQL和使用计数()来查看它是否存在。可能有更优雅的方式来达到同样的事情(可能使用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实例的数据,在内存中创建实例或迭代结果。

+0

我想我举的例子有点太简单了,它让你觉得我所追求的只是检查它是否存在。我也希望得到这个对象,找到会返回它。我现在要修改这个问题。谢谢你的回答,虽然 – Krystian

相关问题