1. 领域模型属性复制
import grails.converters.JSON def fl = FeeList.get(280) def flOld = new FeeListOld(fl.properties) //bindData(flOld, fl.properties, [exclude: 'id']) println flOld as JSON
其中FeeList和FeeListOld两个领域模型数据结构完全相同,以上方法复制后,FeeListOld具有与FeeList相同的数据(除主键ID外)。
=======================================================================
2. 页面应用grails的select标签
controller返回:return [article: article, articleTypes: articleTypes()]
页面上:
<g:select id="article" name='article.id' value="${article?.articleType?.id}" noSelection="${['':'请选择...']}" from='${articleTypes}' optionKey="id" optionValue="name"> </g:select>
=======================================================================
3. 在页面上获取session中的值
<input type="text" name="name" value="${session?.account?.name?.trim()}">
说明:如果session不为空,取其account,如果session.account不为空,取其name,如果session.account.name不为空,进行trim()操作。
=======================================================================
4. GSP页面上显示session中的值
${session.user?.name + "额外字符串"}
=======================================================================
5. 为Grails中的Domain中的属性(字段)设置默认值
class user{
String name
......
int flag = 1
}
红色字体部分
=======================================================================
6. Domain中设置不对应数据库的字段
class Book{
// 这样声明就可以了
static transients = ['otherProperty']
String name
String author
// 'otherProperty' 不让它在数据库中生成book表的字段
String otherProperty
}
看红色字体部分
=======================================================================
7. 页面上直接使用grails传递过来的值(指List)
var ret = '${watertj}';// watertj为grails渲染到页面上的list转为JSON串(watertj:ls as JSON) var xArray = $.makeArray(ret); var _a = eval("(" + xArray[0] + ")");//$.makeArray(xArray[0]); var myData = new Array(); var m = 0 $.each(_a, function(i, ele){ myData.push(new Array(ele.CHARGETYPE, ele.SFJE));// CHARGETYPE、SFJE为List中对象的属性名称 m+=1; });
=======================================================================
8. 使用SQL获取某字段最大值(然后加1),用于自增类的编码
/** * 预订 */ def edit = { def r = new ReserveInfo() StringBuffer sb = new StringBuffer("SELECT MAX(to_number(ri.code)) as mc FROM Reserve_Info ri") def sql = new Sql(dataSource) def ls = sql.rows(sb.toString()); //def code = ReserveInfo.executeQuery("SELECT MAX(to_number(ri.code)) FROM ReserveInfo ri") def _tempCode = ls[0].getProperty("mc") def _maxCode = _tempCode ? _tempCode.intValue() + 1 : 1 return [maxCode: _maxCode, reserve: r, ccList: Changci.findAllByFlag(1) as JSON, floor: Floor.get(params.floorid)] }
主要看StringBuffer sb 到return 前面这部分代码!
=======================================================================
9. createCriteria中的or使用方法
def getFeeList = { def pid_code = session.account.pid def cc = Changci.get(params.id) def ct = ChargeType.findByCode("1") def floor = Floor.get(params.floor) def q = { // createAlias("changci", "cc") and { eq("venus", floor.venus) eq("changci", cc) eq("chargeType", ct) eq("isbs", 1) //'in'("pid", [null, Pid.findByCode(pid_code)] as List) } or { isNull("pid") eq("pid", Pid.findByCode(pid_code)) } } def feeList = FeeList.createCriteria() def results = feeList.list(q) render results as JSON }
=======================================================================
10. Grails查询总结-环境:jdk1.6.0.17、grails1.2
def list = { params.max = Math.min(params.rows ? params.int('rows') : 10, 100) params.offset = params.int('page') ? (params.int('page') - 1 < 0 ? 0 : (params.int('page') - 1) * params.max) : 0 params.sort = params.sort ?: "code" params.order = params.order ?: "desc" def query = { and{ if(params.code && params.code != '') eq("code", params.code) if(params.name && params.name != '') like("name", "%${params.name}%") } } def total = Role.createCriteria().count(query) def roles = Role.createCriteria().list(params, query) /*def roles = Role.createCriteria() { query firstResult(_offset) maxResults(_max) order(params.sort, params.order) }*/ oList['total'] = total oList['rows'] = roles render oList as JSON }
=======================================================================
11. 一个查询例子
def results = c.list { or{ eq("sequence", params.sequence as int) eq("area",area) } maxResults(3) order("level", "desc") }
=======================================================================
12. Grails 复杂查询及分页排序(转自别人的博客:http://brimstone.iteye.com/blog/373704)
最近在使用Idea编写Grails应用程序,Grails的脚手架确实非常方便,写个domain 增删改查一键完成,但是在项目中我们经常希望查询和list页面集成到一起而不必再弄个单独的查询页,另外查询的结果也支持分页与排序,下面是解决方案:
def list = { params.offset = params.offset ? params.offset : 0 params.max = params.max ? params.max : 10 params.sort = params.sort ? params.sort : "id" params.order = params.order ? params.order : "DESC" params.linkmanName = params.linkmanName ? params.linkmanName : "" params.communications = params.communications ? params.communications : "" params.address = params.address ? params.address : "" //if (params.adminName) { def criteria = Linkman.createCriteria() def results = criteria { and { like('linkmanName', '%' + params.linkmanName + '%') like('communications', '%' + params.communications + '%') like('address', '%' + params.address + '%') } maxResults(10) int _offset = params.offset ? Integer.parseInt(params.offset) : 0 firstResult(_offset) order("${params.sort}", "${params.order}") } def _totalCount = Linkman.executeQuery("select count(*) as c from Linkman a where a.linkmanName like '%" + params.linkmanName + "%' and a.communications like '%" + params.communications + "%' and a.address like '%" + params.address + "%'") render(view: 'list', model: [linkmanInstanceList: results, linkmanInstanceTotal: _totalCount.getAt(0)]) }
关于查询在我们这里有3个查询条件,通过criteria 查询结果在Grails1.1文档中就有范例,但是并不能直接得到符合查询条件的结果总数,开始我妄图使用countBy*动态查询器,诸如Linkman.countByLinkmanNameLikeAndCommunicationsLikeAndAddressLike()来做查询,但是从Hibernate输出的SQL语句发现 countBy*动态查询器最多只能支持2个条件(没找到相关说明,仅根据输出的SQL语句判断),所以只能采用别的办法,就是使用executeQuery 手工编写查询语句。
=======================================================================
13. Grails分页查询(另一人的博客:http://seanwon.iteye.com/blog/315677)
在做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参数,这样就可以在分页查询中传递参数了。
=======================================================================
14. Grails中直接使用SQL返回List
import groovy.sql.Sql class DepartmentService { def dataSource boolean transactional = true def serviceMethod() { } def comboTreeList = {deptCode -> StringBuffer sb = new StringBuffer("SELECT TRIM(t.Code) as id, TRIM(t.name) as text, Decode((SELECT COUNT(1) FROM Department@auto_iddbsvr Xx WHERE TRIM(Xx.Code) LIKE TRIM(t.Code) || '___'), 0, 1, 0) as leaftemp FROM Department@auto_iddbsvr t WHERE t.useflag = 1 AND "); String _where = "LENGTH(TRIM(t.Code)) = 3 "; if(deptCode) _where = deptCode == "0" ? _where : "TRIM(t.Code) LIKE '" + deptCode + "___' "; sb << _where sb << "ORDER BY t.Code" def sql = new Sql(dataSource) def ls = sql.rows(sb.toString()); return ls } }
其中:dataSource是grails-app/conf/DataSource.groovy中定义的
=======================================================================
15. Grails按样本查询
主要用到find方法:
方法说明:
指定查询条件(如果没有找到实例为空),查找并返回第一条记录,样例如下:
def _car = outRequest.car def _or = new OutRequest(flag: !2, car: _car) return OutRequest.find(_or)
说明: 上面的语句将查询outrequest表car等于传入的outRequest.car、且flag !=2 的记录
=======================================================================
16. 利用Hibernate的HibernateCriteriaBuilder建立可分页并带有查询条件的查询
def adminList = { params.max = Math.min(params.rows ? params.int('rows') : 10, 100) params.offset = params.int('page') ? (params.int('page') - 1 < 0 ? 0 : (params.int('page') - 1) * params.max) : 0 def articles = Articles.createCriteria() def query = { and{ if(params.name && params.name != '') like("name", "%${params.name}%") } //maxResults(10) order("datetime", "desc") } def recordNumber = articles.count(query) def list = articles.list(params, query) return list }
说明:以上查询自动包括分页要用的页数offset和每页的记录数max!
=======================================================================
17. 使用createAlias进行“以子对象的属性为查询条件的”查询
def enReservedVenuses = { def q = { createAlias("venus", "v") and { eq("v.flag", 1) eq("closeflag", new Long(0)) order("v.orderNumber", "asc") } // maxResults(10) } def ve = VenusExt.createCriteria() def results = ve.list(params, q) def cnt = results.size() return [ves: results] }
或
def enReservedVenuses = { def ve = VenusExt.createCriteria() def results = ve.list { createAlias("venus", "v") and { eq("v.flag", 1) eq("closeflag", new Long(0)) order("v.orderNumber", "asc") } // maxResults(10) } return [ves: results] }
18. Grails页面上数字1……某变量的循环(一般用于分页)
<li> <a href="#"> 前一页 </a> </li> <g:each in="${(1..params.pages)}" var="i"> <li> <a href="javascript:renderDataToGrid('person/list?page=${i}')"> ${i} </a> </li> </g:each> <li> <a href="#"> 后一页 </a> </li>
params.pages是Controller中生成的页数。
19. 解决Grails启动时控制台显示乱码问题
grails -Dfile.encoding=GBK run-app
20. 指定Grails启动时端口
grails -Dserver.port=9090 run-app
结合使用:
grails -Dfile.encoding=GBK -Dserver.port=9090 run-app
相关推荐
11. **性能优化**:讨论Grails应用的性能调优技巧,如内存管理、缓存策略和数据库优化。 12. **Grails进阶**:探索更高级的主题,如异步处理、事件驱动和微服务架构。 13. **案例研究**:通过实际项目示例,综合...
本篇文章将详细介绍如何搭建Grails开发环境以及如何创建一个简单的Grails应用程序。 ### 一、搭建Grails环境 在开始搭建Grails环境之前,我们首先需要确保已经安装了Java环境。因为Grails是基于Groovy的,而Groovy...
- **实战技巧**:包括 GORM (Groovy Object Relational Mapping) 的使用、如何在 Grails 中实现 Ajax 功能、处理遗留数据库的方法、利用遗留框架以及如何在 Grails 中使用 WebFlow。 - **高效编程系列**:涵盖使用 ...
通过阅读《Grails 入门指南》并实践其中的示例,你将能够熟练掌握Grails开发的基础技巧,为进一步深入学习和开发复杂的Grails应用程序做好准备。无论你是对Grails感兴趣的学生,还是寻求技术转型的开发者,这本书都...
- **Grails as a Java Library**:Grails应用可以作为Java项目的库使用,暴露服务接口。 7. **其他高级主题**: - **Testing**:书中会讲解单元测试、集成测试和功能测试的最佳实践。 - **Security**:如Spring ...
- 如何在Grails应用中引用和管理参考数据。 #### 七、控制应用流 **7.1 控制器的本质** - **为Hubbub实现timeline**:创建一个展示用户活动的时间线。 - **添加新的邮件**:实现向时间线中添加新记录的功能。 - *...
#### 四、创建第一个Grails应用 **1. 创建项目** - 使用命令行工具创建一个新的Grails项目。 - 示例命令:`grails create-app myapp` **2. 领域模型** - 定义应用程序的核心实体(例如User、Product等)。 - ...
本文档将带你深入理解Grails的核心概念、主要特性以及实践技巧。 1. **Groovy 语言基础** Groovy 是Java平台上的动态脚本语言,它与Java语法兼容,但更加简洁,支持闭包和元编程。在Grails中,Groovy用于编写控制...
**Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之...通过阅读《Grails 中文手册》,开发者可以深入理解框架的工作原理,掌握各种开发技巧,从而提高开发效率和代码质量。
7. **性能优化与安全**:可能会讨论Grails应用的性能调优技巧,包括缓存策略、数据库查询优化等。此外,安全主题如身份验证、授权和防止SQL注入等也是重要内容。 8. **RESTful Web服务**:Grails支持构建RESTful ...
【标签】:“源码”与“工具”这两个标签暗示了这篇学习记录可能涵盖了Grails框架的源代码解析以及开发者工具的使用技巧。对于“源码”,可能涉及到对Grails内部机制的理解,如控制器、服务、领域模型等的实现;而...
10. **最佳实践与案例研究**:《Grails in Action》很可能包含实际项目案例,展示如何在不同场景下应用Grails,分享最佳实践和技巧。 通过阅读这本书,读者将不仅掌握Grails框架的使用,还能了解到现代Web应用开发...
3. **第一个Grails应用**:通过创建一个简单的应用,读者将学习Grails的基本项目结构,如`grails-app`目录下的各个子目录,以及`BuildConfig.groovy`等配置文件的作用。还将引导读者运行应用,理解Grails的命令行...
- **数据源**:数据源是Grails应用与数据库交互的基础,支持多种类型的数据库连接配置。 - **数据源和环境**:可以根据不同环境配置不同的数据源。 - **JNDI数据源**:对于部署在支持JNDI的应用服务器上的应用,...
在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载...熟练掌握这些技巧,对于提升Web应用程序的功能性和用户体验至关重要。
**Grails 框架与性能测试** Grails 是一个基于 Groovy 语言的开源 Web 应用开发框架,它采用 MVC(Model-View-...通过深入学习 CSS 和性能测试技巧,开发者可以构建出高效、响应式的 Web 应用程序,提升用户的满意度。
此外,还将讲解如何部署Grails应用,包括本地和云端的部署方案。 总的来说,《Grails权威指南》是一本全方位的教程,无论是初学者还是经验丰富的开发者,都能从中受益。它不仅提供详尽的理论知识,还有大量的实例和...
7. 调试和优化:理解如何在Grails应用中定位和修复问题,以及性能调优技巧。 "Grails&Groovy参考资料"这个压缩包文件很可能是包含各种教程、文档、示例代码和其他学习资源的集合,可以帮助你深入理解和实践这两个...