从Grails域对象中的列表中有选择地检索对象

时间:2012-03-16 17:30:46

标签: grails groovy gorm

我进入Grails开发已经有两个月了,偶然发现了这个挑战,我找不到使用书籍,grails网站和论坛搜索的答案。我希望有人可以帮助我。

我有2个域类 - AccountPackage和AccountPackageFeatures。这个想法是AccountPackage(例如黄金账户)可以有许多功能。为了表示这一点,AccountPackage域具有AccountPackageFeatures的嵌入列表。以下是两个域类:

AccountPackage

class AccountPackage {
   String name      // eg. Gold Account
   boolean active   // eg. true - account is active

   List features = []
   static hasMany = [features:AccountPackageFeature]

   static constraints = {  }    
}

AccountPackageFeature

class AccountPackageFeature {

    String featureName      // eg.  "Number of posts allowed"
    String featureCategory  // eg.  "Job Posting"
    String value            // eg.  "10"

    static constraints = {  }

}

数据已保存在数据库中。在我的代码中,我检索了一个特定的AccountPackage实例,现在我想查找该AccountPackage的特定功能。我这样做的方法是从AccountPackage实例获取功能列表,然后遍历列表,直到找到我感兴趣的相应功能。下面的代码片段:

def desiredFeature = null
def desiredFeatureId = 10
AccountPackage pkg = AccountPackage.findByName("Gold Account")

def features = pkg.getFeatures()
for (feature in features) {
   if (feature.id == desiredFeatureId) {
       desiredFeature = feature 
   }
}

我知道这是非常低效的......但是在Grails中这样做的权利是什么?

grails / GORM是否提供任何内置功能以免我进行自定义查询?或者,我应该为我的AccountPackage域对象添加一个名为getFeatureWithId的自定义方法,该方法获取一个ID,然后执行自定义查询以返回所需的功能?

任何关于最佳实践/正确方法的建议都将非常感激。

3 个答案:

答案 0 :(得分:3)

试试这个

    AccountPackage.findByNameAndFeature("Gold Account",AccountPackageFeature.findById(desiredFeatureId))

 AccountPackageFeature.findByIdAndAccountPackage(desiredFeatureId,AccountPackage.findByName("Gold Account"))

答案 1 :(得分:2)

为什么你说你的搜索片段效率低下? 它的复杂性是线性的,因此,在实践中,其效率取决于帐户包可以具有的功能的数量。如果该金额大约为十分之一,那么您不应该费心优化任何事情。

根据经验,“早期优化是万恶之源”。我建议您实施您的解决方案并在实际使用情况下测试其性能,以确定其效率低下是否会损害您的应用程序的性能。

现在关于你的代码片段,你可以利用Groovy语言的一些很酷的功能,我会改写它:

def getFeatureById(desiredFeatureId) {
    def pkg = AccountPackage.findByName("Gold Account")
    pkg.features.find { feature -> feature.id == desiredFeatureId }
}

您可以在Groovy网站上了解CollectionsClosures

答案 2 :(得分:0)

您可以在第二个域而不是循环

上使用动态查找器
 AccountPackage pkg = AccountPackage.findByName("Gold Account")
 def desiredFeature = pkg ? AccountPackageFeature.findByAccountPackage(pkg) : []

查看click here并查找查询关联以获取更多信息