Grails技巧系列——GORM中select結果進行count的方法

來源:互聯網
上載者:User
《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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.