在我
前一篇blog中,我大概介紹了下Flexorm的基本用法。現(xiàn)在由于要在一個(gè)項(xiàng)目中進(jìn)行使用,下午花了些時(shí)間大概看看。
flexorm盡管沒有查詢語(yǔ)言,但是它的Criteria做的基本上也能滿足要求了,比如eq,like以及and,or的Restriction都做了。畢竟用在客戶端的flexorm不會(huì)很復(fù)雜。但是flexorm沒有做pagnation。沒有充分利用sqlite的limit。如果我們的數(shù)據(jù)到了10萬(wàn)條,每次檢索還是費(fèi)時(shí)費(fèi)力,有必要利用limit語(yǔ)法做分頁(yè)。
因此,我首先修改代碼來(lái)計(jì)算count。
1、我原計(jì)劃繼承SelectCommand來(lái)實(shí)現(xiàn)一個(gè)SelectCountCommand的類,結(jié)果發(fā)現(xiàn)hack代碼太多,不如直接在SelectCommand上增加一個(gè)方法,因?yàn)閏ount對(duì)比一般的select無(wú)非是select進(jìn)行改變和去掉orderby。增加以下方法:
public function excuteCount():void {
if (_changed)
prepareStatement();
_statement.text=_statement.text.replace(/select.*?from/gi, "select count(*) as cnt from").replace(/order\s*by/gi, '');
if (_debugLevel > 0)
debug();
_statement.execute();
if (_responder == null)
_result=_statement.getResult().data;
}
2、修改SelectCommand類后,自然要修改EntityManager類,提供查詢Count的方法。
public function fetchCriteriaCountResult(crit:Criteria):int {
var selectCommand:SelectCommand=crit.entity.selectCommand.clone();
selectCommand.setCriteria(crit);
selectCommand.excuteCount();
var cnt:int=(selectCommand.result && selectCommand.result.length > 0) ? selectCommand.result[0].cnt : 0;
clearCache();
return cnt;
}
測(cè)試樣例代碼:
var c:Criteria=entityManager.createCriteria(IaUser);
c.addEqualsCondition("name", "張三");
var cnt:int=entityManager.fetchCriteriaCountResult(c) ;
users=entityManager.fetchCriteria(c)
下一篇博客將實(shí)現(xiàn)Criteria方式的具體分頁(yè)代碼...
posted on 2010-12-10 14:56
不做浮躁的人 閱讀(1337)
評(píng)論(0) 編輯 收藏 所屬分類:
air