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

Grails 如何检查对象是否在域对象的集合中?,grails,associations,gorm,Grails,Associations,Gorm,在对我的应用程序的请求中,我经常会得到对象的ID,这些ID应该是关联的。但是,我必须进行检查,看看它们是否正确 示例场景: A类和B类相关: A { static hasMany = [bs: B] } 在我的请求中,我将获得援助和出价。 我通常做的是: def a = A.get(aid) def b = a.bs.find {it.id == bid} 做这项检查的更好方法是什么?从性能的角度来看 谢谢我的第一个倾向是使用HQL并使用count()查看它是否存在。可能有更优雅的方

在对我的应用程序的请求中,我经常会得到对象的ID,这些ID应该是关联的。但是,我必须进行检查,看看它们是否正确

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

A {
    static hasMany = [bs: B]
}
在我的请求中,我将获得援助和出价。 我通常做的是:

def a = A.get(aid)
def b = a.bs.find {it.id == bid}
做这项检查的更好方法是什么?从性能的角度来看


谢谢

我的第一个倾向是使用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的实例提取数据,在内存中创建实例,或者迭代结果。

如果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的解决方案相同,但这实际上加载了对象。

我想我把这个示例做得有点太简单了,这让你觉得我要做的就是检查它是否存在。我想得到这个对象以及,发现将返回它。我现在要修改这个问题。谢谢你的回答,谢谢托德。我尽量避免双向联想。这主要是因为在大多数情况下,它是多对多的,我只需要一种方式。但在双向的情况下,这似乎是个好主意。如果执行B.get(bid)并检查B.idA==aid(在需要之前不必抓取a),可能会更快。这就是grails的妙处,几乎任何事情都有十几种方法!我的建议是,使用最简单、最容易阅读的代码,并且只有在您发现它实际上产生了真正的性能问题时才对其进行优化。使用分析工具可以帮助找到真正的问题点,而优化后的代码通常不那么容易理解,因此我只关注导致延迟最多的领域,以使代码更易于维护。