Grails技巧系列——GORM中select结果进行count的方法

《Grails技巧系列》将介绍笔者在Grails开发中总结的一些经验。这里将避免重复官方文档中的内容,希望能够以短小的文章给读者更多有价值的内容。 

GROM是Grails框架提供的一种O/R Mapping的解决方案。通过GROM可以摆脱繁琐的SQL书写,并且根据搜索到的结果自动生成Groovy实现,可以省去数据访问层代码的开发,减轻程序员的工作量。Java中的JDO、S2JDBC都是此类框架,而GROM的底层是Hibernate 3,是一种非常广泛用于Java开发的数据层框架。 
(关于GROM的具体使用方法请参考 Grails官方的  《Grails用户手册》 ,这里不作过多描述。) 

GROM提供了很多执行SQL语句的接口,包括用slect语句取得count的结果,如使用下面的代码,可以得到姓Simpson的人的数量。 
def criteria = new DetachedCriteria(Person).build { eq 'lastName', 'Simpson' } 
def results = criteria.list(max:4, sort:"firstName") 

以上例子可以看出,这种提取搜索结果数量的方式,主要针对某一个表的搜索,而在实际的商业开发中,有很多数据搜索是相对复杂的。需要对多个表进行结合,或者,需要通过与子搜索结合起来才能得到搜索结果。 
对于前者,可以通过设定目标之间的关系,通过载入功能就可以实现。但是,后者需要使用子查询的情况就是GORM难以实现的了。这一点是由于GORM内核本身是基于Hibernate的缘故,不但继承了强大的O/R优点,同时也继承了无法使用子查询的软肋。 
这种情况,我个人的做法是使用Groovy访问数据库功能,直接执行select语句,提取执行结果,做法如下: 1.首先在相应的service类中定义  def dataSource ,Grails在执行时会自动将你的DataSouce插入进去 
2.在service类中相应的方法内,类似以下执行并返回结果 
def sql = new Sql(dataSource)
def result = sql.firstRow('select count(*) as c from (select max(c.id) from loveapple_contents c, loveapple_site s\
where s.id = parent_site_id and s.id = ? and parent_category_alias = ? group by c.alias) t' ,
[site.id, categoryAlias]) return result 

这段代码是  番茄CMS 在提取分类中文章数量的一段处理。 

(当然,通常的网站在搜索文章数量是并不需要这么复杂,因为番茄CMS的功能比较多,数据结构比较特殊,所以只能用子查询。) 以上是笔者在Grails开发中用过的搜索count的方法,希望能给大家帮助。


原文地址:http://www.loveapple.cn/app/Grails/grails-chips-gorm-sql-count

你可能感兴趣的:(Grails)