【问题标题】:Grails - Find by non-native typesGrails - 按非本地类型查找
【发布时间】:2011-01-07 00:02:32
【问题描述】:

我对 grails 很陌生(第 2 天)。

首先,我发现很难找到可轻松浏览的资源(文档非常原始,教程散布在各处,仅显示“hello world”类型的示例)。

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

class ShopCategoryPage{
//some stuff
ProductProcedure procedure;
ProductCategory category;
//some stuff
}

在我的控制器中,我获取了一个类别 ID 和一个过程 ID 作为参数,并且我试图获取与这些参数关联的 ShopCategoryPage。

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

我不确定如何通过非本机类型的属性进行查找。

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

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

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

    如果还是不满意,我强烈推荐《Grails 权威指南》一书。相信《Grails in Action》也很不错,但是没看过。对于学习 Groovy,《Programming 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 或条件查询“一次性”加载它。

    【讨论】:

    • 关于书的推荐,2009年1月出版,是不是太老了?或者这仍然是一个不错的选择?
    • 我假设您指的是 TDGTG?这本书涵盖了 Grails 1.1,而最新的版本是 1.2。但是,没有一本书(据我所知)涵盖 1.2,因为它仅在几周前发布。
    • 谢谢,现在刚下单,加急。关于您的代码帮助,请参阅对 Burt 的回答的 cmets。
    • 我的错误,我已经修复了方法名称。应该是findByProcedureAndCategory
    【解决方案2】:

    您永远不应该使用 findById,因为它会绕过基于 id 的二级缓存,并且只使用查询缓存,这更加不稳定。请改用 get()。

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

    def shopCategoryPage = ShopCategoryPage.findByProcedureAndCategory(
           ProductProcedure.get(params.procedureId),
           ProductCategory.get(params.categoryId))
    

    (为两个 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]
    

    【讨论】:

    • 您的答案与我的令人不安的相似;) 您确定在使用 3 查询解决方案时不需要在参数上调用 toLong() 吗?
    • 是 findByProductProcedureAndProductCategory 还是 findByProcedureAndCategory(对象类型与属性名称)?无论哪种方式,我都得到“没有这样的属性:类的过程:mmh.shop.ViewCategoryController”,这很奇怪,因为它谈论的是我的控制器类而不是域类。也因为不管我输入的是“程序”还是“产品程序”,它都会说“程序”。
    • 我已经修复了方法名称。应该是 findByProcedureAndCategory
    • 是的,现在可以了。关于我的错误消息,我不喜欢我在 IF 语句中声明类别和过程,我的错,现在一切正常(直到我很快问另一个问题:))
    • @Don - get() 调用不需要 toLong() ,因为 get() 会为您确定类型。 HibernatePluginSupport 将 get 方法添加到 MetaClass 并在参数上调用 convertToType()。不过先调用它并没有什么坏处。
    【解决方案3】:

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

    除了 Rocher 和 Brown 的“The Definitive Guide to Grails”之外,我还推荐 IBM developerWorks 的 Scott Davis 的“Mastering Grails”。

    http://www.ibm.com/developerworks/views/java/libraryview.jsp?site_id=1&contentarea_by=Java&sort_by=Date&sort_order=1&start=1&end=19&topic_by=&product_by=&type_by=All%20Types&show_abstract=true&search_by=mastering%20grails

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多