Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 y^Kph# F"
9}uW}yJ
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 no]z1D
wUQw!%?>
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 0iK;Egwm
{h2TD
P
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 r8&^>4
J?}WQLVP'
。 2@~M4YJf
Z]WnG'3N
分页支持类: C,NxE5?h
d&u]WVU
java代码: *gF<m9&
d/|D<Sb[s
Q~Hh\L t
package com.javaeye.common.util; }gMDXy}
4e;yG>
import java.util.List;
wm")[!h)v
WN5`;{\
publicclass PaginationSupport { bi&*9K0
HXYRH
publicfinalstaticint PAGESIZE = 30; A"l?:?rtw]
b0A1hb[|
privateint pageSize = PAGESIZE;
qY$qaM^=
*B\H-lp?
privateList items; Vc%R$E%
qc!MG_{Y
privateint totalCount; v-Fg
+
;w-qHha
privateint[] indexes = newint[0]; U
uM$~qf/K
;)I'WQ]Q
privateint startIndex = 0; NeBsv= [-
jhX[fT1m
public PaginationSupport(List items, int @81Vc<dJ
>'xGp7}y
totalCount){ p=B>~CH
setPageSize(PAGESIZE); u#A<hq;
setTotalCount(totalCount);
-0Tnh;&=
setItems(items); M- 2Tz[
setStartIndex(0); ls `,EFF
} HCJ>X;(`f?
f%)zg(YlO
public PaginationSupport(List items, int $GQ-(/
KdUnD4d
totalCount, int startIndex){ -:9P%jWt
setPageSize(PAGESIZE); ww{_c]My
setTotalCount(totalCount); Za7q$7F7Bc
setItems(items); P^Q[-e{
setStartIndex(startIndex); maY4g&'f
} sv(f;ib
_#s=h_
FD
public PaginationSupport(List items, int (?kl$~&|
|Uk"
{
totalCount, int pageSize, int startIndex){ q;D+ai
setPageSize(pageSize); F@!Td(r2
setTotalCount(totalCount); qG/fE'(j&
setItems(items); pdb1GDl0q
setStartIndex(startIndex); CGP3qHrXt
} %?hsoj&k
m8JR@!t7
publicList getItems(){ Ty@=yA17
return items; ,j ',x\
} ).HDru-2
*tX{MSYW
publicvoid setItems(List items){ %|l8f>3[
this.items = items; %q322->Z
} hv$m4,0WB
f8<o8*`7
publicint getPageSize(){ R%H$%cnj
return pageSize; %F9{EXJy
} o}'bv
\cJ-Dd
publicvoid setPageSize(int pageSize){ ]PP:oriWl
this.pageSize = pageSize; W Qzj[
} lhYn5d)DV
q*AQq=
publicint getTotalCount(){ MfBdNdox7
return totalCount; gbSt Ar.
} A+wv-~3
o1OBwPj
publicvoid setTotalCount(int totalCount){ {8EW)4Hf
if(totalCount > 0){ ~;OYtz
this.totalCount = totalCount; 25|8nfeC5
int count = totalCount / m&oi8 P-6
x/MZ(A%D
pageSize; ^D_/=4rz8
if(totalCount % pageSize > 0) *Sf-;U
count++; <n\`d
indexes = newint[count]; )g@S%Yu
for(int i = 0; i < count; i++){ l0Ti Z
indexes = pageSize * a!c[!
W~B5>;y
i; b~C$R[S
} rspayO<]3
}else{ ]AS"z<
this.totalCount = 0; /Go
K}W}
} Uo_tUp_Q
} ]Lqt(c
p'?w2YN/
publicint[] getIndexes(){ xaKst
p
return indexes; >Dg#9
} =`C4qC_
DV]7.Bm
publicvoid setIndexes(int[] indexes){ A?"h@-~2
this.indexes = indexes; UU}7U]9u
} .`Zf}[5[
<;t)6:N\
publicint getStartIndex(){ I#FF*@oeM
return startIndex; I5);jgb
} 3Gr&p6
AdoZs8Q
publicvoid setStartIndex(int startIndex){ w,j cm;
if(totalCount <= 0) D~&Mwsi
this.startIndex = 0; iY/KSX^~O
elseif(startIndex >= totalCount) o8FXqTUcs4
this.startIndex = indexes q cA`)j
qturd7
[indexes.length - 1]; Y
ZaP
elseif(startIndex < 0) 7/X"z=Q^|
this.startIndex = 0; Zq ot{s
else{ N\1/JW+
this.startIndex = indexes h:Ndzp{
;<G<1+
[startIndex / pageSize]; ;+I4&VieK
} TQ1WVq
}*
} Lg`Jp&Kg
,
Ut Hc]
publicint getNextIndex(){ L$Z(+6m5
int nextIndex = getStartIndex() + YirC*
=O{~Q3z@s
pageSize; U06o;s(
if(nextIndex >= totalCount) XqR{.jF.
return getStartIndex(); MdhT!?
else Ew^ @Aq
return nextIndex;
H=zN[MU
} ,R-Y~+!
LEc8NQs
publicint getPreviousIndex(){ 1 2]fQkp
int previousIndex = getStartIndex() - '%3{jc-}
U?U(;nSR\A
pageSize; :?r*p>0$
if(previousIndex < 0) n2;9geq+
return0; a|N0(C
else It
2UfW
return previousIndex; TIRHT`"i
} 2Yyb#Ow
%9c|%#3
} {>.>7{7
&?$\Y,{
"zZ&n3=@
z(d4)z 8'6
抽象业务类 h1%y:[_
java代码: 5|WOBOh>`&
eECj_eH-
tm xP Oe
/** fJ :jk6@
* Created on 2005-7-12 O~Uw&Bq
*/ Z oTNm
package com.javaeye.common.business; .D@/y uV
[n<.fw8$b
import java.io.Serializable; *!u?
import java.util.List; ucFw,sB1
Fi{mr*}
import org.hibernate.Criteria; @dhH;gt.I
import org.hibernate.HibernateException; 0P:F97"1,
import org.hibernate.Session; ty;o&w$
import org.hibernate.criterion.DetachedCriteria; cJq<9(
import org.hibernate.criterion.Projections; bf^ly6ml
import I;iR(Hf)?q
(j`l5r#X#/
org.springframework.orm.hibernate3.HibernateCallback; &(\@sxAyZ
import s#Q_Gu
?lG;,,jc,W
org.springframework.orm.hibernate3.support.HibernateDaoS 6(5c7R#
vcD'~)G(*
upport; &@oq~j_7
@{de$ODu
import com.javaeye.common.util.PaginationSupport; M7pvxChA
B(EtXB9
public abstract class AbstractManager extends D1~^\)*
wO\!xW:
HibernateDaoSupport { @>9A$w$H|a
v*gLNB,ZH
privateboolean cacheQueries = false; H.;yLL=
c( 8W8R
privateString queryCacheRegion; k%a?SU<f
x_pMG!2
publicvoid setCacheQueries(boolean ;op'V6iG
qSCTFJ0
cacheQueries){ 6 cr^<]v !
this.cacheQueries = cacheQueries; :Q#H(\26r
} \Em-.%c
iqlVlm>E
publicvoid setQueryCacheRegion(String =1&}t%<X
OUKj@~T
queryCacheRegion){ {9,R@>R
this.queryCacheRegion = 8s&2gn1
_.hIv8V
queryCacheRegion; qIUC2,&g
} zVn* !c
GHqBnE{B
publicvoid save(finalObject entity){ vzQyE0T/
getHibernateTemplate().save(entity); @YbZ8Uc
} Hm<M@M$aG
-<12~HKK::
publicvoid persist(finalObject entity){ k@lXXII ?
getHibernateTemplate().save(entity); I[a%a!QO
} [j1^$n 8V
k.h^ $f
publicvoid update(finalObject entity){ )<tzm'Rc
getHibernateTemplate().update(entity); 8:BQHYeJK
} oO}>i0ax*
6#/LyzZq|
publicvoid delete(finalObject entity){ 3 pHn_R
getHibernateTemplate().delete(entity); xBt4~q;#sE
} Y#.6d
}$&);7(w
publicObject load(finalClass entity, [cY?!Qd0
T\.7f~3
finalSerializable id){ " Tw0a!
return getHibernateTemplate().load e*6U |+kJ
+KYxw^k}"7
(entity, id); L)j]~^P$-
} 8p3ZF@c~t
Rqt[D @;m
publicObject get(finalClass entity, ejDCmD
wZ}n3R,
finalSerializable id){ "o~N42DLB%
return getHibernateTemplate().get QGu7D #%|
P((S2"D<4
(entity, id); {EZFx,@t
} Gl dH SCy
)+VHt
publicList findAll(finalClass entity){ [ ((h<e
return getHibernateTemplate().find("from ~k"eEV
p
A)~/~
" + entity.getName()); 0#2T0zk
} :4Id7Ce
_wIBm2UO
publicList findByNamedQuery(finalString &*LA_]1@
Y8{T.\%\+
namedQuery){ >}xAg7\^
return getHibernateTemplate w50.gr7
I%.jc2kK
().findByNamedQuery(namedQuery);
&
bp#1KR)
} ~m009
A}
x_zt
publicList findByNamedQuery(finalString query, |8&\N
qBf wN 1
finalObject parameter){ )F=JkG
return getHibernateTemplate 1 P(&GYc
Vq? 8u/
().findByNamedQuery(query, parameter); H'j_<R N
} rQ9?N^&!%
}L{_xyi>#
publicList findByNamedQuery(finalString query, ^\Ue7,H-
3Qm
t]q
finalObject[] parameters){ q!ulE{ ^
return getHibernateTemplate S&;T_^|
tU-#pB>H
().findByNamedQuery(query, parameters); %N?W]vbra
} z&6]vN'
n0>5'm%ES
publicList find(finalString query){ YL0WUD_>
return getHibernateTemplate().find !HT>
%B*<BgJ;4F
(query); gdkLPZ<<
} +8?R+0P
o`JlXuG?o
publicList find(finalString query, finalObject vfk7J5y
c,{&
parameter){ i`ZHjW~`
return getHibernateTemplate().find 0%q{UW2
^=heen<S%
(query, parameter); [<@A8Q5,y
} 8\W3FvQ
n9mM5H47
public PaginationSupport findPageByCriteria w|K(>5nz
%nG~u,_2f
(final DetachedCriteria detachedCriteria){ `CTkx?e[
return findPageByCriteria
0&SrKn
6cgpg+-a
(detachedCriteria, PaginationSupport.PAGESIZE, 0); )\:lYI}Wpm
} 2s]]!{Z#
f0HV*%8
public PaginationSupport findPageByCriteria D!OG307P
+lk\oj$S+
(final DetachedCriteria detachedCriteria, finalint H *z0xxa
4P-'(4I)
startIndex){ m,"cbJ
/
return findPageByCriteria Pv/%s) &y&
)0 42?emn
(detachedCriteria, PaginationSupport.PAGESIZE, ,]>`guDV
leX7(Y;!a7
startIndex); GakmROZ@9
} }.Na{]<gh
C7c|\ T
public PaginationSupport findPageByCriteria tSh}0N)
fs)q7 7g
(final DetachedCriteria detachedCriteria, finalint G74a9li@
]'bQ(<^#
pageSize, hBY h90]
finalint startIndex){ ,sRrV $,"
return(PaginationSupport) )sz2 9
66Cj=n5
getHibernateTemplate().execute(new HibernateCallback(){ L3hxe]mr
publicObject doInHibernate 3gfV0C\
G-Ml+@e>
(Session session)throws HibernateException { \8@[bpI@g
Criteria criteria = ,~=z_G`R
9<0$mE^:
detachedCriteria.getExecutableCriteria(session); V]CK'
int totalCount = VE S4x%r=
:b3lJ-dB
((Integer) criteria.setProjection(Projections.rowCount IZ(CRKCGBl
07G*M ]
()).uniqueResult()).intValue(); |WwFE|<
criteria.setProjection uN?O*h/(
59%f|.Z)
(null); s+\qie
List items = XQg%*Rw+t
4d3]pvv
criteria.setFirstResult(startIndex).setMaxResults ?T%K +
4'4s EjyA
(pageSize).list(); b6E8ase:F
PaginationSupport ps = d8y=.
Kt&$Si
new PaginationSupport(items, totalCount, pageSize, 0Ts_"p
FO3eg"{N
startIndex); Wp~4[f`,
return ps; #I{Yf(2Z
} tRrY)eElS
}, true); DoPF/m}
} I5<#SW\a?
1069]
public List findAllByCriteria(final W U4vb
kl{OO%jZ
DetachedCriteria detachedCriteria){ vS,G<V3B
return(List) getHibernateTemplate />j+7ts
BNKo6:wy
().execute(new HibernateCallback(){ & b^*N5<Z
publicObject doInHibernate B,na
x2IU PM
(Session session)throws HibernateException { G<WDyoN=O
Criteria criteria = @W5hrei
JV6U0$g_S
detachedCriteria.getExecutableCriteria(session); r
:MaAT<
return criteria.list(); @xM!:
} x)qHeS
}, true); \5pAG
mgD
} %dWFg<< |
~9>[ U%D
public int getCountByCriteria(final ;g)Fhdy!
FSZoT!
DetachedCriteria detachedCriteria){
*/dsMa
Integer count = (Integer) `]I5WTt*X
N(/<qv
getHibernateTemplate().execute(new HibernateCallback(){ 5Yibv6:3a
publicObject doInHibernate ALieUf
[<1+Q =;
(Session session)throws HibernateException { [q{Txe
Criteria criteria = $j2)_(<A%Q
+mW$D@Pf
detachedCriteria.getExecutableCriteria(session); [^BUhm3a
return N~<}\0
<XcMc<h~
criteria.setProjection(Projections.rowCount JhXN8Bq33
F0^~YYRJV
()).uniqueResult(); W%Nu]9T
} lNeF>zz
}, true); >nW}zkfn
return count.intValue(); 7a_n\]t465
} d"`>&8*
} K1{nxw!`
'oeg[
{gHscj;SM
z ex.0OT;
SIVLYi
X^ ]$/rI)
用户在web层构造查询条件detachedCriteria,和可选的 <hC3#dNRd
8PVs!?Nne
startIndex,调用业务bean的相应findByCriteria方法,返回一个 _eeX]xSSl
v2=!*
PaginationSupport的实例ps。 [?6D1b[
yzzre>F
ps.getItems()得到已分页好的结果集 +dpj?
ps.getIndexes()得到分页索引的数组 ^dKaa
ps.getTotalCount()得到总结果数 6e-h;ylS
ps.getStartIndex()当前分页索引 '#
2J?f'
ps.getNextIndex()下一页索引 4J2F>m40
ps.getPreviousIndex()上一页索引 bc}OmPE
SJ_cwYwI$
naCI55Wx
!w\;Q8irN
72.IhBNtT
DH*|>m&
x9
L\"
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 . pEeR
g;Q^_4@
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 )7mJ+d[
_q}%!#4
一下代码重构了。 l0 :xQV`
y:zT1I@>
我把原本我的做法也提供出来供大家讨论吧: &{{f|o=u.
eZkz 1j~
首先,为了实现分页查询,我封装了一个Page类: TUYl><F5v=
java代码: [ +@<T)
Lk+1r8
\I{A33i2w
/*Created on 2005-4-14*/ aT1W]i
package org.flyware.util.page; BFu9KS+@)
a8P6-)W
/** RWcQT`
* @author Joa g' U^fN
* T>o# *{qn
*/ uKzz/Y{
publicclass Page { 717m.t,x
,qqV11P]
/** imply if the page has previous page */ FLOJ
privateboolean hasPrePage; Z6ex<[`I
?kefRev<#h
/** imply if the page has next page */ R6.#gb8^oS
privateboolean hasNextPage; +34jot.!
3!UP>,!
/** the number of every page */ 3`q`W9
privateint everyPage; oob0^}^
aJ@qB9(ZBe
/** the total page number */ ]}c=U@D,9
privateint totalPage; . M$D
+'4 dP#
/** the number of current page */ )q-!5^ak
privateint currentPage; jd'R2e
He23<hd!
/** the begin index of the records by the current Y)RikF >
O:R{4Q*5
query */ .H.v c_/
privateint beginIndex; ^:j:;\;
<p
.[E]a2_
g5\B- 3{
/** The default constructor */ hY9u#3
public Page(){ )ISTb
8R D)yRJ
} 4(ZV\}j1
>GRuS\B
/** construct the page by everyPage E/ )+hK&
* @param everyPage 5E|2S_)G
* */ Z:Am\7 I
public Page(int everyPage){ KgSxF#
this.everyPage = everyPage; !!>G{
} bm?TMhC
g"f^YEQ_
/** The whole constructor */
o`0H(\en
public Page(boolean hasPrePage, boolean hasNextPage, =Ji:nEl]z
$^>vJk<
Xs_y!l
int everyPage, int totalPage, ;& +75n
int currentPage, int beginIndex){ ?^p8]Va%
this.hasPrePage = hasPrePage; c5pG?jr+d
this.hasNextPage = hasNextPage; w:v:znQrW
this.everyPage = everyPage; .ji%%f
this.totalPage = totalPage; j=4>In?x
this.currentPage = currentPage; ,Fiiw
this.beginIndex = beginIndex; M?lr#}d
} voE c'JET
mD3#$E!A1
/** [8#l~
|U
* @return Qg=~n:j
* Returns the beginIndex. .}s a2-
*/ WH*&MIjAr/
publicint getBeginIndex(){ 4Rq"xYGXh
return beginIndex; v<W++X7z
} ;<H2N0qJ(
/.bwwj_;
/** J$[Vm%56
* @param beginIndex "?-s
Qn
* The beginIndex to set. eH6cBX#P.
*/ i9tM]/SP
publicvoid setBeginIndex(int beginIndex){ L zC~> Uj
this.beginIndex = beginIndex; Sq%R
} vD t?N9
*fZ'#C~x
/** /8T{bJ5
* @return IZLX[y
* Returns the currentPage. @}:(t{>;e7
*/ fJKOuFK
publicint getCurrentPage(){ {rQ`#?J}^?
return currentPage; ML-g"wv
} TuL(
/
W#7c`nm
/** `N+ P,
* @param currentPage TzJN,]F!M
* The currentPage to set. mMH0 o
*/ !WXSrICX[
publicvoid setCurrentPage(int currentPage){ /2 (F
this.currentPage = currentPage; C4,W[L]4"
} PH.v3
3K
Zlhr0itf
/** aoN[mV'
* @return l]gfT&
* Returns the everyPage. gqd#rjtfz
*/ vSh)r 9
publicint getEveryPage(){ ::6@mFL R
return everyPage; NG ~sE&,7
} 6*tGf`Pfdw
*RhdoD|a
/** .E(Ucnz/
* @param everyPage -[z;y73]t
* The everyPage to set. fy5)Tih%.*
*/ ,
{^g}d8
publicvoid setEveryPage(int everyPage){ KVBz=
this.everyPage = everyPage; QMP:}
} lOZZ-
I5{SC-7
/** 7-)KTBFL
* @return ~<-i7uM
* Returns the hasNextPage. Gwe9<
y
*/ zK v}J
publicboolean getHasNextPage(){ TD<. :ul]
return hasNextPage; 3 }XS|Y
} t V</x0#
}I"^WCyH
/** (Q&Z/Fe
* @param hasNextPage C'Q} Z_
* The hasNextPage to set. NR" Xn7G
*/ hz!.|U@,{<
publicvoid setHasNextPage(boolean hasNextPage){ {dDU^7O
this.hasNextPage = hasNextPage; Q =Z-vTD+
} j1)w1WY0@
*=rl<?tX
/** @L0.Z1 ).
* @return sqhM[u
k
* Returns the hasPrePage. }QK-@T@4<
*/ o 0B`~7(
publicboolean getHasPrePage(){ B4%W,F:@
return hasPrePage; \RJ428sxn
} w5p+Yx=q
UWz<~Vy
/** F{v+z8nW
* @param hasPrePage #H|]F86 (
* The hasPrePage to set. o&zeOJW
*/ #~"jo[
publicvoid setHasPrePage(boolean hasPrePage){ iVE+c"c!2&
this.hasPrePage = hasPrePage; c(fwl`y!x
} %j
yLRT]H
R b'"09)$
/** ,xGkE7=5
* @return Returns the totalPage. FKPI{l
* 9kcAMk1K
*/ i -+B{H
publicint getTotalPage(){ HQ"D>hsuU
return totalPage; j:g/[_0s
} "Mth<%i
'j|;M
/** MOXDR
* @param totalPage ^vUdf.n9
* The totalPage to set. 9!tRM-
*/ ."${.BPn~
publicvoid setTotalPage(int totalPage){ >354O6
this.totalPage = totalPage; ZDlMkHJ
} m6s32??m
uv, t(a.^
} <3'r&ks
/p~gm\5Z
w1[F]|
a!;?!f-i
ws@;2?%A
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 "!2Fy-Y
\\_Qv
个PageUtil,负责对Page对象进行构造: ."dmL=
java代码: p\Jz<dkN1
J*.qiUAgW
koFY7;_<?
/*Created on 2005-4-14*/ k@^)>J^
package org.flyware.util.page; LbnR=B!
;L|%H/SH
import org.apache.commons.logging.Log; 13Q|p,^R
import org.apache.commons.logging.LogFactory; oE}1D?3Sp
E}UlQq
/** H13|bM<
* @author Joa 2%QY~Ku~
* [E+#+-n7
*/ 1N2s[ \q$
publicclass PageUtil { : -OHD#>%
bEbnZ<kz*
privatestaticfinal Log logger = LogFactory.getLog m3 ,i{
t68h$u
(PageUtil.class); _&P![o)x
~)ls.NXI
/** Pn0V{SJOJ%
* Use the origin page to create a new page 5TqX;=B
* @param page ~nw]q<7r
* @param totalRecords /_v@YB!0
* @return D3$}S{Yw1
*/ z6\Y& {
publicstatic Page createPage(Page page, int sa{X.}i%E
XDU&Z2A
totalRecords){ {2A/ @$?
return createPage(page.getEveryPage(), z>~Hc8*]3
?Yxk1Y4ig)
page.getCurrentPage(), totalRecords); jT%k{"+>+?
} 1s .Ose
;kY'DKL(
/** 1-4W4"#
* the basic page utils not including exception 5P [b/.n
Ry8@U9B6,t
handler l:%4@t`
* @param everyPage 4$C:r&K
* @param currentPage __OD^?qa
* @param totalRecords wjDLsf,
* @return page f3h^R20qmO
*/ 5#~u U
publicstatic Page createPage(int everyPage, int vzG(u_,9[
^<Q+=\h
currentPage, int totalRecords){ _Uc le
everyPage = getEveryPage(everyPage); Srg`Tt]
currentPage = getCurrentPage(currentPage);
v[\'
M
int beginIndex = getBeginIndex(everyPage, wS9EC}s:Q
b$[O^p9x
currentPage); 3+rud9T
int totalPage = getTotalPage(everyPage, adRvAq]mA
]25 x X
totalRecords); <J!#k@LY]7
boolean hasNextPage = hasNextPage(currentPage, "CX&2Xfe
'(4$h3-gv7
totalPage); jNBvy1
boolean hasPrePage = hasPrePage(currentPage); \hoYQK j
;b-Y$<
returnnew Page(hasPrePage, hasNextPage, ^^1rjh1I
everyPage, totalPage, QE1DTU
currentPage, #**vIwX-Q
3!ZndWSHV
beginIndex); A@^Y2:pY
} d#'aT mu!
-AWL :<
privatestaticint getEveryPage(int everyPage){ i{vM NI{
return everyPage == 0 ? 10 : everyPage; eTw sh]
} v47Y7s:uQ
B_$hi=?TTd
privatestaticint getCurrentPage(int currentPage){ ~RgO9p(dY
return currentPage == 0 ? 1 : currentPage; B@U;[cO&
} 2|8e7q: +*
Hx5t![g2K!
privatestaticint getBeginIndex(int everyPage, int ckG`^<
9)}Nx>K
currentPage){ vau0Jn%=ck
return(currentPage - 1) * everyPage; z)*7LI
} >VIb|YA
JI##l:,7r
privatestaticint getTotalPage(int everyPage, int R-5EztmLae
XpFW(v
totalRecords){ {]ie|>'=C
int totalPage = 0; J=Q?_$xb}
u2}zRC=
if(totalRecords % everyPage == 0) &]~Vft
l
totalPage = totalRecords / everyPage; H=,0p
else w_4/::K*
totalPage = totalRecords / everyPage + 1 ; g:V8"'
]rU$0)VN
return totalPage; aAJ'0xnj
} JO{Rth
WCJ$S\#
privatestaticboolean hasPrePage(int currentPage){ QU{|S.\
return currentPage == 1 ? false : true; b5NPG N
} M*6}# ST
;iEr+
privatestaticboolean hasNextPage(int currentPage, "-bsWC
4AA3D!$
int totalPage){ 6d4)7PL
return currentPage == totalPage || totalPage == ZxW4 i
2GkJ7cL
0 ? false : true; C^2J<
} RHe'L36W
bruM#T@}
&