Grails-按非本机类型查找

Grails-按非本机类型查找,grails,groovy,Grails,Groovy,我对grails(第2天)非常陌生 首先,我发现很难找到易于浏览的资源(文档非常原始,教程分散,只显示“hello world”类型的示例) 我已经设置了与其他数据类型的关系的域类 class ShopCategoryPage{ //some stuff ProductProcedure procedure; ProductCategory category; //some stuff } 在我的控制器中,我获取一个类别id和一个过程id作为参数,并尝试获取与这些参数关联的ShopCatego

我对grails(第2天)非常陌生

首先,我发现很难找到易于浏览的资源(文档非常原始,教程分散,只显示“hello world”类型的示例)

我已经设置了与其他数据类型的关系的域类

class ShopCategoryPage{
//some stuff
ProductProcedure procedure;
ProductCategory category;
//some stuff
}
在我的控制器中,我获取一个类别id和一个过程id作为参数,并尝试获取与这些参数关联的ShopCategoryPage

我如何“找到”他们?我尝试将id作为procedureId或procedure_id传递,我尝试传递由findById生成的ProductProcedure对象

我不知道如何通过非本机类型的属性查找

首先,我发现很难找到易于浏览的资源(文档非常原始, 这些教程是分散的,只显示“hello world”类型的示例)

在我看来,文档很好,也许我们使用的是不同的文档。我使用:

  • ,即Groovy添加到Java类的方法
如果这仍然不能令人满意,我强烈推荐《Grails的权威指南》一书。我相信《圣杯在行动》也很好,但我还没有读过。对于学习Groovy,《Groovy编程》是一本很棒的书(尽管有点过时)

在我的控制器中,我得到一个类别id和一个过程id作为参数,我 正在尝试获取与这些参数关联的ShopCategoryPage

最简单的方法(虽然不是最有效的)是使用动态查找器

// First of all load the ProductProcedure and ProductCategory 
// I'm assuming here the request params are named 'procedureId' and 'categoryId'
ProductProcedure productProcedure = ProductProcedure.get(params.procedureId.toLong())
ProductCategory productCategory = ProductCategory .get(params.categoryId.toLong())

// Now get the ShopCategoryPage associated with these. Replace 'find' with 'findAll'
// if there could be multiple associated ShopCategoryPages
ShopCategoryPage shopCategoryPage = ShopCategoryPage.findByProcedureAndCategory(productProcedure, productCategory)

这种方法的一个缺点是会导致执行3条SELECT语句。如果您只对上一次查询返回的shopCategoryPage感兴趣,您可以使用HQL或条件查询“一次性”加载此页面。

您不应该使用findById,因为它将绕过基于id的二级缓存,而只使用查询缓存,因为查询缓存的波动性要大得多。改为使用get()

话虽如此,有两种方法可以做到这一点。一种是使用get():

(为两个ID使用适当的参数名称)

或者使用HQL查询(或条件查询)在一个查询中而不是在3个查询中获取实例:

def shopCategoryPage = ShopCategoryPage.executeQuery(
   'from ShopCategoryPage p where p.procedure.id=:procedureId and p.category=:categoryId',
    [procedureId: params.procedureId.toLong(), categoryId: params.categoryId.toLong()])[0]

我同意,最简单的方法是使用动态查找器

除了Rocher和Brown的《Grails权威指南》之外,我还推荐Scott Davis的IBM developerWorks曲目《掌握Grails》


关于这本书的推荐书,它于2009年1月发布。这算是太老了吗?或者这仍然是一个不错的选择?我想你指的是TDGTG?本书涵盖Grails1.1,而最新版本为1.2。但是,据我所知,没有一本书(我所知)涵盖1.2版,因为它只是在几周前发布的。谢谢,现在刚刚订购,请加急。关于您的代码帮助,请参阅对Burt答案的注释。我的错误是,我已修复了方法名称。它应该是
findbyproceduredcategory
您的答案与我的答案惊人地相似;)您确定在使用3-query解决方案时不必对参数调用
toLong()
?是findByProductProcedureAndProductCategory还是findByProcedureAndCategory(对象类型vs属性名称)?不管怎样,我都会得到“没有这样的属性:类的过程:mmh.shop.ViewCategoryController”,这很奇怪,因为它谈论的是我的控制器类而不是域类。也因为不管我是键入procedure还是ProductProcedure,它都会显示“procedure”。我已经修复了方法名。它应该在程序或分类中找到它现在起作用了。关于我的错误消息,它不喜欢我在IF语句中声明类别和过程,我的错,现在一切都正常了(直到我很快问另一个问题:)@Don-get()调用不需要toLong(),因为get()为您计算出了类型。HibernatePluginSupport将get方法添加到元类中,并对参数调用convertToType()。不过先打电话也没什么坏处。
def shopCategoryPage = ShopCategoryPage.executeQuery(
   'from ShopCategoryPage p where p.procedure.id=:procedureId and p.category=:categoryId',
    [procedureId: params.procedureId.toLong(), categoryId: params.categoryId.toLong()])[0]