`
leon1509
  • 浏览: 533246 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)Grails中的命名查询

阅读更多
原贴地址:http://www.groovyq.net/content/grails%E4%B8%AD%E7%9A%84%E5%91%BD%E5%90%8D%E6%9F%A5%E8%AF%A2

Grails从1.2起已经支持命名查询了,但在按章节分的那个参考文档中并没有详细的说明其用法,倒是在“领域类”的细目说明中给出了基本使用。最近,Peter Ledbrook在“再说Grails 1.3特性”中给出了相关的说明。

命名查询是通过在Domain Class中定一个namedQueries静态属性实现的:

class Report {
    String name
    static hasMany = [frequencies: Frequency, servers: Server]
    static namedQueries = {
        inFirstWeek {
            frequencies {
                eq("wom", 1)
            }
        }
        inWeek { wom ->
            frequencies {
                eq("wom", wom)
            }
        }
        dilbertsReports {
            servers {
                eq("mgrEmail", "dilbert@nowhere.org")
            }
        }
        inCity { city ->
            servers {
                location {
                    eq("city", city)
                }
            }
        }
}

它的典型使用:

Report.inFirstWeek.list()
Report.inWeek(2).list(),要想给命名查询传参数,只要在相应的闭包中定义即可
Report.inFirstWeek.get(3),注意,get中传入的是DomainClass的id,如果查询结果中有此id,那么返回相应记录;反之为null
Report.dilbertsReports.inFirstWeek.list(),级联进行查询不断细化结果集
在命名查询中使用的完全是Criteria DSL,对于有过SQL背景的同学来说可能不是特别习惯,而更愿意去使用HQL。但是从我个人的体验来说,因为我也是这么过来的,如果你放弃了Criteria DSL,那你就放弃了简化代码的大好机会!在查询条件是根据一个查询条件窗体自动产生的场景中,使用Criteria DSL绝对比起自己去拼凑HQL要来得清晰简单,且不易出错。这种例子已经有很多了,在此就不再赘述。

在本文的结尾,我再给出使用Criteria DSL时进行分页、排序的另一种做法。这种做法在文档中并没有记录,但是通过查看源码是可以发现的。其做法跟咱们使用DomainClass.list时的方法完全一模一样,这样就比起自己在Criteria DSL里去写要简便多了。同时,在查询结果较多,需要进行分页显示时,只需要构造一个Criteria即可,而不需要写成2个。废话少说了,看例子便可以明白:

def query ={
    def filter= JSON.parse(params.filter)
    def filterJob = {
        and{
            source{
                or{
                    filter.source.each{ key, value ->
                        if(value){
                            eq("id", key.split('-')[1] as long)
                        }
                    }
                }
            }
            if(filter.category!='all'){
                categorys{
                    eq("id", filter.category as long)
                }
            }
            if(filter.options.resolved!='all'){
                eq("resolved", Boolean.valueOf(filter.options.resolved))
            }
            if(filter.options.paied!='all'){
                eq("paied", Boolean.valueOf(filter.options.paied))
            }
        }
    }
     
    def rval= [:]
    rval.records= Job.createCriteria().list(params, filterJob)
    rval.totalRecords= Job.createCriteria().count(filterJob)
    render rval as JSON
}

上面的例子摘自我个人项目中的源码,filterJob闭包是根据一个查询窗体去构造相应的查询条件。由上面可以看出,这要比起自己去拼凑HQL要清晰很多。这里的另一个重点在于这两句:Job.createCriteria().list(params, filterJob)和Job.createCriteria().count(filterJob)。前者查询出结果,并根据params中的分页排序参数去完成相应的分页和排序,后者则得出整个查询的大小。完全跟Grails中generate-all命令产生的代码类似!利用这个做法,我们只需要构造一个DSL即可,否则要是按文档中介绍的把order和分页相关的部分也作为Criteria DSL中一部分定义,那么上面的records和count就得写成2个。

Peter还在其文章中介绍了Grails 1.3的其他特性,有兴趣的可访问原文。
分享到:
评论

相关推荐

    Grails 中文参考手册

    - **规约配置**:Grails遵循一定的约定,例如文件组织和命名规范,以提高开发效率。 - **运行和测试应用**:指南涵盖了如何启动、测试和部署Grails应用,包括单元测试和集成测试。 - **部署**:讲解了在各种Java ...

    Grails入门指南 -- 针对grails1.0.4更新

    - **动态查询**:支持基于动态条件的查询操作,增加查询灵活性。 - **界面美化**:通过布局和CSS美化页面,提升用户界面的设计感。 #### 三、Grails进阶 - **安全性**: - **用户认证**:实现用户登录、权限验证...

    在Eclipse里使用Grails类创建工具.pdf

    ### 在Eclipse中高效利用Grails类创建工具 在深入探讨如何在Eclipse环境中使用Grails类创建工具之前,我们先简要回顾一下Grails框架及其核心特性。Grails是一款基于Groovy语言的高性能Web应用开发框架,它遵循约定...

    grails开发笔记

    4. **变量作用域**:在 Grails 中,变量的作用域有 `page`、`request`、`flash`、`session` 和 `application` 等。例如,`flash` 用于存储临时消息,如错误信息等。 5. **特殊操作符**:如 `==` 和 `is` 分别对应 ...

    grails-web-url-mappings-2.5.4.zip

    此外,URL映射还支持命名的URL,这样可以在视图或控制器中方便地引用它们,提升代码的可读性。例如: ```groovy "/books"(name: 'booksList', controller: 'book', action: 'list') ``` 然后在视图中可以使用`...

    grails templates脚手架优化

    在Grails框架中,模板(Template)是一种强大的工具,它用于快速生成代码,尤其是在构建脚手架(Scaffolding)时。脚手架是自动创建的CRUD(创建、读取、更新、删除)界面,它极大地提高了开发效率,使得开发者无需...

    The Grails Framework - Reference Documentation

    - **减少配置工作**:Grails遵循一定的命名和组织结构约定,减少了大量手动配置的需求。 - **提高开发效率**:使得开发者可以快速搭建项目结构并进行开发。 ##### 2.7 运行应用程序 - **命令行方式**:使用`grails ...

    Grails-MyBatis:用于 Grails 框架的 MyBatis 插件

    命名约定的一些变化 添加了对多个数据源的完全支持 Grails 2.0 插件重构 最小 Grails 依赖项 2.0.3 添加了对可选乐观锁定的支持 - 基于 MyBatis Optimist 插件( ),同时避免 Java 注释(约定优于配置) 添加了...

    Grails,移动互联网时代服务器端开发的利器

    在Grails中,一个典型的开发流程如下: 1. **创建项目** 使用`grails create-app`命令创建一个新的Grails应用,如`grails create-app testApp`,这会生成基本的项目结构。 2. **定义领域模型** 在`src/groovy`...

    grails-flyway:Flyway对Grails的支持

    4. **Grails命令**:提供了`flyway:migrate`、`flyway:clean`等Grails命令,方便在Grails环境中执行数据库迁移操作。 5. **多环境支持**:根据Grails的环境配置(如开发、测试、生产),插件可以应用不同的迁移策略...

    grails-icu:提供ICU4J的消息格式功能,例如命名参数支持,灵活的复数格式,基于规则的数字格式,日期间隔格式

    compile ' org.grails.plugins:icu:1.0 '}特征命名参数默认情况下,Grails允许在i18n消息中仅使用编号的参数。 该插件还允许使用命名参数,有时更易读。 例如: numbered={0}, you have {1} unread messages of {2}...

    richui-two:适用于 Grails 2.3.4 的 RichUI Grails 插件版本 > *

    在 "richui-two" 插件中,开发者可以找到一系列 JavaScript 库和组件,这些库和组件经过精心设计,能够与 Grails 后端无缝集成。JavaScript 在现代 web 开发中扮演着至关重要的角色,它负责处理客户端逻辑,实现动态...

    tlv:基于网络的电子书,用于栅格图像

    转到tlv/apps/tlv-app并将application.yml.local复制到同一目录中,并将其命名为application.yml 。 转到tlv/apps/tlv-app并运行grails run-app 。 在浏览器中转到http://localhost:8090/tlv 。 特别分支 根据...

Global site tag (gtag.js) - Google Analytics