`
seanwon
  • 浏览: 65630 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GRAILS 分页 查询

阅读更多
在做grails的查询分页的时候,发现一个问题,那就是输入的查询参数不能作为条件在分页之间传递,而且如果做分页查询的总数也不得而知,针对多条件criteria查询(也适用于HQL查询)做了如下实现,代码如下:
最主要的是蓝色标注的部分,创建新的criteria,用projection的rowCount()方法,统计总条数,查询条件要保持一致,然后制定参数传递给view。
def bookingInstance = new Booking(params)
                def criteria = Booking.createCriteria()
               
                def max = 5
                def offset = 0
                if(params.max) max = params.max.toInteger()
                if(params.offset) offset = params.offset.toInteger()
                def results = criteria {
                    and {
                        if(bookingInstance.employee && session.employee.role=='Admin'){
                            eq('employee',bookingInstance.employee)
                        }
                        if(bookingInstance.meetingRoom){
                            eq('meetingRoom',bookingInstance.meetingRoom)
                        }
                        if(bookingInstance.startDateTime){
                            println bookingInstance.startDateTime
                            ge('endDateTime',bookingInstance.startDateTime)
                        }
                        if(bookingInstance.endDateTime){
                            le('startDateTime',bookingInstance.endDateTime+1)
                        }
                        maxResults(max)
                        firstResult(offset)
                        order('startDateTime', 'asc')
                    }
                }
                def criteria1 = Booking.createCriteria()
                def branchCount = criteria1.get {

                    and {
                        if(bookingInstance.employee && session.employee.role=='Admin'){
                            eq('employee',bookingInstance.employee)
                        }
                        if(bookingInstance.meetingRoom){
                            eq('meetingRoom',bookingInstance.meetingRoom)
                        }
                        if(bookingInstance.startDateTime){
                            println bookingInstance.startDateTime
                            ge('endDateTime',bookingInstance.startDateTime)
                        }
                        if(bookingInstance.endDateTime){
                            le('startDateTime',bookingInstance.endDateTime+1)
                        }
                    }
                    projections {
                        rowCount()
                    }
                }
                params.branchCount = branchCount
                 params.page = 1
                println "${branchCount}nnnn"    
                render(view:'searchresults',model:[ bookingInstanceList: results,params:params ])


view的代码如下:
<g:paginate controller="booking"
                        action="search" total="${params.branchCount}"
                        max="5" maxsteps="4" params="${params}" />
主要是指定max,params,total参数,这样就可以在分页查询中传递参数了。
分享到:
评论
7 楼 take 2012-03-08  
理论上是可以返回个PagedResultList类型对象,里面可以包含List和count.
但我现在只要返回PagedResultList, 程序就会报错.!
6 楼 seanwon 2010-08-04  
eye4sany 写道
不觉得有一大段的代码写了两遍吗

上面一段是演示不分页的,下面一段是演示分页的。。

不过这个方案不是最好的了,看一下SSailYang的回复:

SSailYang 写道
不用这么麻烦。如果你向 list 方法中传递分页信息
list(max:x, offset:x) {
  // query criteria
}

list 方法将返回 PagedResultList 类型的对象。你可以通过 PagedResultList 中的 totalCount 属性得到记录的总数。

5 楼 eye4sany 2010-08-04  
不觉得有一大段的代码写了两遍吗
4 楼 java-007 2009-11-05  
thanks!
3 楼 seanwon 2009-01-28  
我搞明白了,SSailYang您太有才了,这个我找了很多api和参考,竟然没有找到。

如果有相应的参考文档,还请共享。

criteria的list方法,如果指定max:x,offset:y参数,返回的是PageResultList类型,如果不指定,是返回的ArrayList类型。

这太有才了。
2 楼 seanwon 2009-01-28  
SSailYang 写道

不用这么麻烦。如果你向 list 方法中传递分页信息


Java代码

list(max:x,&nbsp;offset:x)&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;//&nbsp;query&nbsp;criteria &nbsp;&nbsp;
}&nbsp;&nbsp;list(max:x, offset:x) {
  // query criteria
}
list 方法将返回 PagedResultList 类型的对象。你可以通过 PagedResultList 中的 totalCount 属性得到记录的总数。


我可能方法不对,但是按照你提到的做了,好像没有totalCount这么一个属性。
1 楼 SSailYang 2009-01-28  
不用这么麻烦。如果你向 list 方法中传递分页信息
list(max:x, offset:x) {
  // query criteria
}

list 方法将返回 PagedResultList 类型的对象。你可以通过 PagedResultList 中的 totalCount 属性得到记录的总数。

相关推荐

    grails实现分页技术

    3. **分页查询**:使用上述参数,你可以从数据库中获取当前页的数据。Grails的GORM提供了`offset`和`max`方法来实现这一点: ```groovy def pageData = MyDomain.list(max: params.max, offset: (params.page - 1) ...

    grails框架数据查询

    分页查询示例: ```groovy def users = User.list(max: 10, offset: 0) // 获取第一页的10条记录 ``` 排序示例: ```groovy def users = User.findAllByAgeGreaterThan(18, [sort: 'age', order: 'desc']) ``` ### ...

    Grails GORM查询.pdf

    Grails框架中的GORM(Groovy Object Relational Mapping)是利用Groovy语言的优势来简化数据库操作的一套对象关系映射技术。GORM支持多种查询方式,提供了类似于Hibernate的查询能力,并且由于Groovy语言的动态特性...

    一步一步学grails(5)

    《逐步学习Grails框架(5):构建动态组合查询与分页功能》 在Grails开发过程中,构建动态组合查询和实现分页展示是常见的需求。本篇教程将介绍如何在Grails应用中创建一个根据产品编号进行组合查询,并以分页形式展示...

    学习grails框架时候自己写的例子

    Grails提供了方便的分页API,可以轻松地在控制器(Controller)中实现分页逻辑,并在视图(View)中展示结果。在这个例子中,你可能已经掌握了如何实现这一功能。 4. **数据库管理**:`contact_dev.sql`文件可能是...

    学生管理系统课程设计(grails)

    Grails支持动态查询,允许开发者通过简单的表达式进行复杂的数据库查询。同时,为了确保系统安全性,可以使用Spring Security插件来实现用户认证和授权,限制未授权访问。 六、分页功能 实现分页功能,Grails提供了...

    Grails权威指南

     8.6 对数据进行分页  8.7 创建自定义标签  8.7.1 创建标签库  8.7.2 自定义标签基础内容  8.7.3 演示自定义标签  8.7.4 测试自定义标签  8.8 本章小结 第9章 ajax  9.1 ajax基础...

    grails导出csv

    这可能来自数据库查询、服务调用或其他任何数据源。例如: ```groovy def exportCsv() { def users = UserService.getAllUsers() } ``` 3. **创建CSV响应** 使用Grails的`response`对象,设置合适的HTTP头...

    Grails自定义scaffolding模板

    - **`list.gsp`**:显示数据列表的页面,通常包括搜索和分页功能。你可以修改这个模板以改变列表的显示方式,添加排序功能,或者定制搜索表单。 - **`search.gsp`**:如果存在,用于构建高级搜索条件的页面。可以...

    Grails入门指南

    1. **动态查询器**:提供灵活的数据查询能力,支持条件筛选、排序、分页等功能,无需编写复杂的SQL语句。 2. **动态脚手架**:自动生成基本的CRUD界面,加速开发过程,后期可定制修改。 五、Grails与其他技术的关系...

    grails templates脚手架优化

    可以通过调整查询方式,如分页查询,或者优化数据模型来提高性能。 3. **代码风格与规范**:确保生成的代码符合团队的编码规范,可以调整模板以匹配缩进、命名约定等。 4. **扩展功能**:在模板中加入自定义的行为...

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    5.2.2 数据库的分页查询 54 5.2.3 将查询改造为inner join 59 5.3 显示分页导航 60 5.4 本章小结 62 第6章 用户注册与登录 63 6.1 表单验证与资源文件 63 6.2 用户注册 69 6.3 用户登录 73 6.3.1 登录的数据库查询 ...

    grails脚手架2次优化

    4. **性能优化**:可能需要调整查询方式,如分页、缓存、异步处理等。 ### 三、优化步骤与技巧 1. **自定义模板**:在`src/templates/scaffolding`目录下,可以创建自己的模板,覆盖默认模板,实现定制化界面。 2...

    java课程设计(20211003221521).pdf

    10. 具体操作的实现:细化每个功能的具体实现细节,如分页功能的实现,可以使用Grails的pagination插件来实现。 在开发过程中,持续测试和调试是非常重要的,确保所有功能都能正常工作。最后,编写详细的用户手册和...

    java课程设计.pdf

    在这个特定的课程设计中,学生被要求开发一个"网络工程同学录"应用程序,使用Grails框架进行构建。Grails是一个基于Groovy语言的开源Web应用框架,它简化了Java Web开发过程,提供了丰富的插件系统和MVC(模型-视图-...

    dataframe:用于Grails的快速Web开发插件

    DataFrame是Grails框架中一个非常有用的插件,它旨在加速Web应用的开发过程,特别是处理数据展示和交互的环节。Grails是一个基于Groovy语言的开源Web应用框架,它简化了构建动态、敏捷Web应用的过程。DataFrame插件...

    DocumentViewer:文档查看器演示,使用 Grails 2.4.3 和 Angular JS

    该项目使用 Grails 2.4.4 和 Java 7 — MySQL 是一个可选组件,目前仅在生产环境中启用。 该应用程序具有以下可配置选项: demo.bootstrapData(默认为 false)。 如果启用,它将为开发以外的环境创建引导程序...

    elasticsearch-head-master

    此外,它还提供了可视化的分页、排序和过滤选项,使得数据探索变得直观而高效。 标签"elasti"可能指的是Elasticsearch,这是一个流行的开源搜索引擎和数据分析平台。Elasticsearch采用了分布式、RESTful的工作方式...

Global site tag (gtag.js) - Google Analytics