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

Grails应用技巧

阅读更多

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

 

分享到:
评论

相关推荐

    Grails从入门指南(第二版)

    11. **性能优化**:讨论Grails应用的性能调优技巧,如内存管理、缓存策略和数据库优化。 12. **Grails进阶**:探索更高级的主题,如异步处理、事件驱动和微服务架构。 13. **案例研究**:通过实际项目示例,综合...

    Groovy轻松入门——Grails实战基础篇

    本篇文章将详细介绍如何搭建Grails开发环境以及如何创建一个简单的Grails应用程序。 ### 一、搭建Grails环境 在开始搭建Grails环境之前,我们首先需要确保已经安装了Java环境。因为Grails是基于Groovy的,而Groovy...

    grails快速开发web

    - **实战技巧**:包括 GORM (Groovy Object Relational Mapping) 的使用、如何在 Grails 中实现 Ajax 功能、处理遗留数据库的方法、利用遗留框架以及如何在 Grails 中使用 WebFlow。 - **高效编程系列**:涵盖使用 ...

    Grails 入门指南+示例源码

    通过阅读《Grails 入门指南》并实践其中的示例,你将能够熟练掌握Grails开发的基础技巧,为进一步深入学习和开发复杂的Grails应用程序做好准备。无论你是对Grails感兴趣的学生,还是寻求技术转型的开发者,这本书都...

    Grails权威指南.pdf

    - **Grails as a Java Library**:Grails应用可以作为Java项目的库使用,暴露服务接口。 7. **其他高级主题**: - **Testing**:书中会讲解单元测试、集成测试和功能测试的最佳实践。 - **Security**:如Spring ...

    Grails入门指南-中文版

    #### 四、创建第一个Grails应用 **1. 创建项目** - 使用命令行工具创建一个新的Grails项目。 - 示例命令:`grails create-app myapp` **2. 领域模型** - 定义应用程序的核心实体(例如User、Product等)。 - ...

    grails 文档

    本文档将带你深入理解Grails的核心概念、主要特性以及实践技巧。 1. **Groovy 语言基础** Groovy 是Java平台上的动态脚本语言,它与Java语法兼容,但更加简洁,支持闭包和元编程。在Grails中,Groovy用于编写控制...

    grails 中文手册

    **Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之...通过阅读《Grails 中文手册》,开发者可以深入理解框架的工作原理,掌握各种开发技巧,从而提高开发效率和代码质量。

    Grails技术精解与web开发实践11-20章

    7. **性能优化与安全**:可能会讨论Grails应用的性能调优技巧,包括缓存策略、数据库查询优化等。此外,安全主题如身份验证、授权和防止SQL注入等也是重要内容。 8. **RESTful Web服务**:Grails支持构建RESTful ...

    Grails学习记录

    【标签】:“源码”与“工具”这两个标签暗示了这篇学习记录可能涵盖了Grails框架的源代码解析以及开发者工具的使用技巧。对于“源码”,可能涉及到对Grails内部机制的理解,如控制器、服务、领域模型等的实现;而...

    grails in action

    10. **最佳实践与案例研究**:《Grails in Action》很可能包含实际项目案例,展示如何在不同场景下应用Grails,分享最佳实践和技巧。 通过阅读这本书,读者将不仅掌握Grails框架的使用,还能了解到现代Web应用开发...

    Grails技术精解与web开发实践2-10章

    3. **第一个Grails应用**:通过创建一个简单的应用,读者将学习Grails的基本项目结构,如`grails-app`目录下的各个子目录,以及`BuildConfig.groovy`等配置文件的作用。还将引导读者运行应用,理解Grails的命令行...

    Grails基础教程

    - **数据源**:数据源是Grails应用与数据库交互的基础,支持多种类型的数据库连接配置。 - **数据源和环境**:可以根据不同环境配置不同的数据源。 - **JNDI数据源**:对于部署在支持JNDI的应用服务器上的应用,...

    grails中的上传,下载

    在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载...熟练掌握这些技巧,对于提升Web应用程序的功能性和用户体验至关重要。

    grails-perf-testapps:用于性能测试的简单 Grails 应用程序集合

    **Grails 框架与性能测试** Grails 是一个基于 Groovy 语言的开源 Web 应用开发框架,它采用 MVC(Model-View-...通过深入学习 CSS 和性能测试技巧,开发者可以构建出高效、响应式的 Web 应用程序,提升用户的满意度。

    Grails权威指南

    此外,还将讲解如何部署Grails应用,包括本地和云端的部署方案。 总的来说,《Grails权威指南》是一本全方位的教程,无论是初学者还是经验丰富的开发者,都能从中受益。它不仅提供详尽的理论知识,还有大量的实例和...

    Grails&Groovy学习资料

    7. 调试和优化:理解如何在Grails应用中定位和修复问题,以及性能调优技巧。 "Grails&Groovy参考资料"这个压缩包文件很可能是包含各种教程、文档、示例代码和其他学习资源的集合,可以帮助你深入理解和实践这两个...

Global site tag (gtag.js) - Google Analytics