`
leon1509
  • 浏览: 528048 次
  • 性别: 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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics