搜索执行Grails技巧系列——GORM中select结果进行count的方法
近期个人几篇文章分析了改搜索执行的文章. 关联文章的址地
《Grails技能系列》将分析笔者在Grails开辟中结总的一些教训。这里将免避复重官方文档中的容内,希望可以以短小的文章给读者更多有价值的容内。
GROM是Grails架框供给的一种O/R Mapping的解决方案。通过GROM可以脱摆繁琐的SQL写书,并且根据搜索到的结果主动生成Groovy实现,可以省去据数拜访层代码的开辟,轻减程序员的工作量。Java中的JDO、S2JDBC都是此类架框,而GROM的底层是Hibernate 3,是一种非常普遍于用Java开辟的据数层架框。
(关于GROM的详细用使方法请参考 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的能功比拟多,据数结构比拟殊特,所以只能用子查询。) 以上是笔者在Grails开辟中用过的搜索count的方法,希望能给大家助帮。
原文址地:http://www.loveapple.cn/app/Grails/grails-chips-gorm-sql-count
文章结束给大家分享下程序员的一些笑话语录:
问路
有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”
下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。
热气球上的人说:“你一定是在 IT 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。