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