Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造
?hpk)Qu
AuYi$?8|5
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 J XnPKAN
B[MZPv)
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 Qs{Qg<}
cWM|COXL+
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 _mL 9G5~r
,K6]Q|U@r
。 9Au+mIN
p:ST$ 1 K
分页支持类: &f qmO>M
Q<``}:y|>
java代码: M+^K,
AjANuyUaP
C5RDP~au
package com.javaeye.common.util; S8vmXlD
.^.UJo;4G
import java.util.List; aLXA9?
+;[`fSi
publicclass PaginationSupport { L{fP_DIa
?3z+|;t6C
publicfinalstaticint PAGESIZE = 30; n8G#TQrAE
\a]\jZb
privateint pageSize = PAGESIZE; ,n!xzoX_
c)6Y.[).
privateList items; lE|T'?/
Nyqm0C6m^
privateint totalCount; JcVq%~{M
'HcDl@E
privateint[] indexes = newint[0]; M*S5&xpX
56_KB.Ww~
privateint startIndex = 0; C aJD*
<7]
z'
public PaginationSupport(List items, int usTCn3u
VYAe!{[
totalCount){ S8)awTA9
setPageSize(PAGESIZE); \!V6` @0KC
setTotalCount(totalCount); N~ozyIP,
setItems(items); >aWJ+
setStartIndex(0); .CpF0
} N8{>M,
U; q)01
public PaginationSupport(List items, int +Ae.>%}
)w`Nkx
totalCount, int startIndex){ pq&c]8H
setPageSize(PAGESIZE); |}|;OG
setTotalCount(totalCount); 8say"Qz
setItems(items); 5UM[Iz
setStartIndex(startIndex); 2$ rq
} N_DgnZ7*
PYf`a`dH
public PaginationSupport(List items, int Bm7GU`j"
vPsX!m[#
totalCount, int pageSize, int startIndex){ f\^QV
setPageSize(pageSize); ]/']{*T1
setTotalCount(totalCount); Vi|jkyC8
setItems(items); N.`]D)57
setStartIndex(startIndex); -&A[{m <,>
} ,'673PR
)AoFd>
publicList getItems(){ MnI $%
return items; o|W? a#_\
} ?f`-&c;
:jX~]1hpmA
publicvoid setItems(List items){ RVsN r
rZ
this.items = items; 80EY7#r@w
} ("oA{:@d
y{]%,
publicint getPageSize(){ ezvaAhd{
return pageSize; aVYUk7_ <
} K5lp-F
[s2V-'2
publicvoid setPageSize(int pageSize){ h<.[U
$,
this.pageSize = pageSize; ka3Z5
} Sv@p!-m
|7$h@KF=S
publicint getTotalCount(){ 9%qMZP0]
return totalCount; >nDnb4 'C
} kU/=Du
eNFUjDm
publicvoid setTotalCount(int totalCount){ sJ/e=1*
if(totalCount > 0){ (O2HB-<rY
this.totalCount = totalCount; y^\#bpq&\
int count = totalCount / ^BX@0"&-
([-=NT}Aq
pageSize; =.hDf<U
if(totalCount % pageSize > 0) 88$Y-g5*
count++; i)i)3K2
indexes = newint[count]; e}[we:
for(int i = 0; i < count; i++){ jPNfLwVkl:
indexes = pageSize * jSYg\Z5!
ZD%_PgiT
i; %UQB?dkf$
} N-9gfG
}else{ S "Pj1
this.totalCount = 0; \]A;EwC4C
} |S:!+[
} c/Yi0Rl)
y9li<u<PF
publicint[] getIndexes(){ \_AEuz3
F
return indexes; vfUfrk@D~
} }@%ahRGx%9
j(C
UYm
publicvoid setIndexes(int[] indexes){ m`IQ+,e
this.indexes = indexes; >Ryss@o
} aijGz<
cC^C7AAq^
publicint getStartIndex(){ Jx$#GUl#j
return startIndex; UX`DZb+^
} qmeml_(W
L?27q
publicvoid setStartIndex(int startIndex){ Au} ;z6k
if(totalCount <= 0) %Rep6=K*$
this.startIndex = 0; }K80G~O2<
elseif(startIndex >= totalCount) 0nn]]B@l
this.startIndex = indexes p_qm}zp
iEVA[xy=D
[indexes.length - 1]; Jrd4a~XP
elseif(startIndex < 0) -^4bA<dCCE
this.startIndex = 0; w;@25=
|
else{ Dbdzb m7
this.startIndex = indexes 72ViPWW
<cv2-?L{
[startIndex / pageSize]; ~8xh0TSi
} 2Uv3_i<
} =ym
4:Xj-l^D
publicint getNextIndex(){ )@bH"
int nextIndex = getStartIndex() + 6~F#F)C'
xR|eye R
pageSize; AuDR |;i
if(nextIndex >= totalCount) #W@% K9
return getStartIndex(); W`u$7k]$
else H*{k4
return nextIndex; 5+bFy.UW
} Vv]$\`d#
;4kx >x*H
publicint getPreviousIndex(){ `Ixs7{&jU
int previousIndex = getStartIndex() - dT]L-uRZgy
a#Kmj0
pageSize; $35,\ZO>
if(previousIndex < 0) r2SJp@f
return0; p584)"[*t
else +#*&XX5A#?
return previousIndex; ByhOK}u;P4
} ~TG39*m
~Un64M?
} E#<7\p>
bk7^%O>
x[PEn
2{mY:\
抽象业务类 abICoP1zQ
java代码: rkfQr9Vc
_b0S
Bw3F7W~l
/** V;iL[
* Created on 2005-7-12 Iys6R?~
*/ !K3i-zY
package com.javaeye.common.business; _\,rX\
e(}oq"'z
import java.io.Serializable; ^e?$ ]JiA!
import java.util.List; *|];f#^9
rWoe
?g
import org.hibernate.Criteria; "JzfL(yt
import org.hibernate.HibernateException; vIVw'Z(g}
import org.hibernate.Session; K08 iPIkQ
import org.hibernate.criterion.DetachedCriteria; _kn]#^ucCe
import org.hibernate.criterion.Projections; #0P!xZ'|{
import =<[7J]%
>.J'L5
x$
org.springframework.orm.hibernate3.HibernateCallback; 3D
9N:c
import ljup#:n
Lzh9DYU6
org.springframework.orm.hibernate3.support.HibernateDaoS +jq
2pFQ
a?zR8$t|
upport; EvwbhvA(
MxY50^}(
import com.javaeye.common.util.PaginationSupport;
*-9# /Cp
CxJfrI_W
public abstract class AbstractManager extends 3AvVU]@&Z@
ZJ^s}
HibernateDaoSupport { } c{Fa&
Sdgb#?MR|
privateboolean cacheQueries = false; UskZ%J
uDILjOT
privateString queryCacheRegion; *Jb_=j*)
U+4HG
publicvoid setCacheQueries(boolean OYBotk]{1
myD{sE2A
cacheQueries){ *I=_*LoG2
this.cacheQueries = cacheQueries; mYX56,b}5
} pz$_W
ER{yuw
publicvoid setQueryCacheRegion(String hgj CXl
G-2EQ.
queryCacheRegion){ w'd.;
this.queryCacheRegion = NeY"6!;k
wOjv[@d
queryCacheRegion; gk"mr_03
} lNHNL
a>W
.SG0}8gW
publicvoid save(finalObject entity){ e d_m +NM
getHibernateTemplate().save(entity); Y\.DQ
} [d0%.+U
!2(.$}E
publicvoid persist(finalObject entity){ bpGzTU
getHibernateTemplate().save(entity); 77``8,
} /;DjJpwf0
o5>/}wIf
publicvoid update(finalObject entity){ Pfm*<,'x"[
getHibernateTemplate().update(entity); r9?o$=T
} :H{Bb{B%
}bp.OV-+
publicvoid delete(finalObject entity){ Cgo9rC~]
getHibernateTemplate().delete(entity); R^w}o,/
} @2u#93Y
t{~@I
publicObject load(finalClass entity, L+73aN
#7+]%;h
finalSerializable id){ =m~ruZ/
return getHibernateTemplate().load M=W
4:H,gx
q=njKC
(entity, id); vuZf#\zh}
} k9l^6#<?
/0
_zXQyV
publicObject get(finalClass entity, w m19T7*L
0:. 6rp
finalSerializable id){ GJvp{U}y9I
return getHibernateTemplate().get 8|6~o.B.G
n%*tMr9 s
(entity, id); @/LiR>,
} KYf;_C,$
bTiBmS
publicList findAll(finalClass entity){ [-Cu4mff
return getHibernateTemplate().find("from ac|/Y$\w
4b=Gg
" + entity.getName()); 2Q}7fht
} L$SMfx
^@K
WYAAW5
publicList findByNamedQuery(finalString ,aWCiu}
z<i,D08|d
namedQuery){ s@PLS5d"
return getHibernateTemplate K>$qun?5
l77'Lne
().findByNamedQuery(namedQuery); xdqK.Z%
} =6fB*bNk]
u3ST;
publicList findByNamedQuery(finalString query, R1Yqz $#
1U'ZVJ5bpK
finalObject parameter){ ~pRs-
return getHibernateTemplate ~@@
Z|w
!UVk9
().findByNamedQuery(query, parameter); }1Z6e[K?
} ??j&i6sp
l/QhD?)9
publicList findByNamedQuery(finalString query, =-5[Hn%
#n#HzbT
finalObject[] parameters){ AX K95eS
return getHibernateTemplate `6}Yqh))
G1/Gq.<
().findByNamedQuery(query, parameters); p_r4^p\
} S2Vx e@b)
w{r8kH
publicList find(finalString query){ <S&]$?`{Wi
return getHibernateTemplate().find >8(jW
vzG ABP
(query); h\FwgkJP
} T0Q51Q
>uHb ^
publicList find(finalString query, finalObject 9(Jy0]E~
;?`@"YG)
parameter){ ]VDn'@uM
return getHibernateTemplate().find Bq;1^gtpe
MnS+ nH!d
(query, parameter); jqtVpNwM
}
#Z0-8<\
bS%C?8
public PaginationSupport findPageByCriteria {Xv3:"E"O
}/"4|U
(final DetachedCriteria detachedCriteria){ =JxFp,
Xr
return findPageByCriteria WL:0R>0
(0}j]p'w
(detachedCriteria, PaginationSupport.PAGESIZE, 0); _*n)mlLln
} *uU4^E(
ai9
public PaginationSupport findPageByCriteria "k, K ~@}
LQ>$>A(
(final DetachedCriteria detachedCriteria, finalint OpUA{P
[T]Bf o
startIndex){ 5k~\or 5_
return findPageByCriteria !-,Ww[G>
7>mhK7l
(detachedCriteria, PaginationSupport.PAGESIZE, N iISJWk6'
&mdB\Y?^
startIndex); }hq^+fC?
} 3HKxYvc C
.)t(:)*b
public PaginationSupport findPageByCriteria U{HML|
cd&B?\I
(final DetachedCriteria detachedCriteria, finalint sUV>@UMnu
j%WY ,2P
pageSize, Gk 6fO
finalint startIndex){ O4!9{
return(PaginationSupport) N%*9&FjrL
@ t|3gF$X
getHibernateTemplate().execute(new HibernateCallback(){ f~R[&q+
publicObject doInHibernate x{?sn
Bj=@&;
(Session session)throws HibernateException { 8JP6M!F#
Criteria criteria = ,2_w=<hq
xU:4Y0y8
detachedCriteria.getExecutableCriteria(session); B/G3T
u uG
int totalCount = :~erh}~ps
_Fxe|"<^
((Integer) criteria.setProjection(Projections.rowCount #h{Nz/h+
7*MU2gb
()).uniqueResult()).intValue(); 0$QIfT)
criteria.setProjection 1OP"5f
E|{m"RUOy
(null); pALJl[Cb
List items = ki3 HcV
y{92Lym
criteria.setFirstResult(startIndex).setMaxResults F+3!uWUK
gwJ}]Tf
(pageSize).list(); 1@@y]s_.a
PaginationSupport ps = )vQNiik#
mtIMW9
new PaginationSupport(items, totalCount, pageSize, @.1Qs`pt
jr:drzr{I
startIndex); )tvc/)&A}
return ps; &urb!tQ>&
}
WAv@F[
}, true); *0\k
Z,#BJ
} ?R282l
F^xaz^=`u
public List findAllByCriteria(final u]0!|Jd0
@2?=3Wf
DetachedCriteria detachedCriteria){ r_q~'r35 _
return(List) getHibernateTemplate c8q G\\t[
8;0^'Qr8
().execute(new HibernateCallback(){ ExQ--!AC=
publicObject doInHibernate H6{Rd+\Z
5c)wZ
(Session session)throws HibernateException { %xHu,*
Criteria criteria = |veBq0U
6# R;HbkO
detachedCriteria.getExecutableCriteria(session); K)Ge
return criteria.list(); tpE3|5dZF
} t9]r
}, true); sI$:V7/!
} bje'Oolc
z30= ay1
public int getCountByCriteria(final f!(cD80
?o@E1:aA
DetachedCriteria detachedCriteria){ 5uzpTNAMM1
Integer count = (Integer) <9T
[yg
h ;jsH!
getHibernateTemplate().execute(new HibernateCallback(){ I'P!,Y/>
publicObject doInHibernate $:P[v+Uy
=O;eY ?
(Session session)throws HibernateException { >H8^0n)?
Criteria criteria = |]I#CdO
,d5ia4\K
detachedCriteria.getExecutableCriteria(session);
nMeS CX
return I ;l`VtD
fq{I$syY
criteria.setProjection(Projections.rowCount 2AmR(vVa"
(Y&R0jt
()).uniqueResult(); wH#Lb@cfZ0
} |O2|`"7
}, true); 31H|?cg<
return count.intValue(); ddl3fl#f
} W%w82@'
} 7~:>WMv9
/oB K&r[(
H_v/}DEG
gr[D!D>
i;gw=Be
-g~iE]x6Y
用户在web层构造查询条件detachedCriteria,和可选的 VB}P Ng
s9=pV4fA~w
startIndex,调用业务bean的相应findByCriteria方法,返回一个 O$YJku
!P+~c0DF
PaginationSupport的实例ps。 S".owe$\
YstXNN4
ps.getItems()得到已分页好的结果集 bl6':m+
ps.getIndexes()得到分页索引的数组 CRP7U
ps.getTotalCount()得到总结果数 [@jp9D
H
ps.getStartIndex()当前分页索引 @b4b{d5[
ps.getNextIndex()下一页索引 zR_9D}
ps.getPreviousIndex()上一页索引 [qq`cT@
dV'6m@C
L>eQ*311
I):m6y@
_$~ex ~v
i_'|:Uy*F
N.kuE=X
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 G;87in ,}
"~B~{ _<j
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 ^Jc$BMaVg
&?&'"c{;m
一下代码重构了。 MAl{66
3ZLr"O1l )
我把原本我的做法也提供出来供大家讨论吧: DX7Ou%P,mg
"87O4
#$
首先,为了实现分页查询,我封装了一个Page类: a>#d=.
java代码: (v9!g#
0q-0zXlSL
zS#f%{
/*Created on 2005-4-14*/ Tq_1wX'\
package org.flyware.util.page; H!Fr("6}
u66TrYS tG
/** 56/.*qa
* @author Joa R V_MWv
* d{vc
wZQ
*/ ot&j HS'
publicclass Page { ;))[P_$zB
eG a#$x?.
/** imply if the page has previous page */ Z_ iQU1
privateboolean hasPrePage; 7R%
PVgS4x
$sB48LJuU'
/** imply if the page has next page */ My`josJ`Pb
privateboolean hasNextPage; $fq-wl-=
n3-GnVC][
/** the number of every page */ 4+Li)A:4.
privateint everyPage; p7?CeyZ-V
k:&?$
/** the total page number */ NXC~#oG
privateint totalPage; ^Y1AeJ$L
eP-R""uPw
/** the number of current page */ r? 6Z1
privateint currentPage; 8+@1wks
*+4>iL*:
/** the begin index of the records by the current f=-!2#%
zM3H@;}m
query */ P"[ifsp
privateint beginIndex; _"FbjQ"
==r?
t6! p\Y}}
/** The default constructor */ R(n0!h4
public Page(){ ;@=@N9qK
|1\dCE03}
} +3~Gc<OO
.~V".tZV[
/** construct the page by everyPage x0TnS#
* @param everyPage *IjdN,wox
* */ Huug_E+
public Page(int everyPage){ {!:|.!-u
this.everyPage = everyPage; qW` XA
} V@5 4k*V
ZIGbwL
/** The whole constructor */ ^HOwN<}`#
public Page(boolean hasPrePage, boolean hasNextPage, sk%:Sp
!$ J)
wAj(v6
int everyPage, int totalPage, ps{&WT3a
int currentPage, int beginIndex){ PEwW*4Xo
this.hasPrePage = hasPrePage; }(vOaD|k=
this.hasNextPage = hasNextPage; {U+9,6.`
this.everyPage = everyPage; T^-H_|/M
this.totalPage = totalPage; ,i$(yx?
this.currentPage = currentPage; )KTWLr;
this.beginIndex = beginIndex; i85+p2i7
} hz>yv@1
S{`!9Pii
/** F?+Uar|-a
* @return |tolgdj
* Returns the beginIndex. M7cI$=G
*/ '6Z/-V4k
publicint getBeginIndex(){ Xbsj:Ko]]U
return beginIndex; A<*tn?M]
} tZc.%TU
dKN3ZCw*gF
/** TnZc.
* @param beginIndex l,FG:"`Z@
* The beginIndex to set. SjNwT[.nr7
*/ G+\~rl
publicvoid setBeginIndex(int beginIndex){
!]jNVg
this.beginIndex = beginIndex; * zJiii
} M%Kx{*aw&
G3^n_]Jb
/** C>(M+qXL+
* @return /i]=ndAk
* Returns the currentPage. e4NX\tCpw
*/ %lqG* dRx0
publicint getCurrentPage(){ X
G@>1/
return currentPage; pN^G[
} aGzdur
VHXR)}
/** $4ZDT]n
* @param currentPage #\!hBL
@b
* The currentPage to set. "l2N_xX;
*/ [7Kj$PB3
publicvoid setCurrentPage(int currentPage){ `- uZv
this.currentPage = currentPage; 3
v,ae7$U&
} F" #3s=
ju2X*
/** L^ jC&
dF
* @return YQ[&h
* Returns the everyPage. 9Av- ;!]
*/ &V,-W0T_
publicint getEveryPage(){ AQBx
k[
return everyPage; `X]2iz
} 1wH/ #K
HU.6L'H*
/** Ul~}@^m]4}
* @param everyPage Ivgwm6M
* The everyPage to set. V44sNi
*/ J Wyoh|
publicvoid setEveryPage(int everyPage){
] !*
this.everyPage = everyPage; Zv7$epDUz
} TYLl_nGr
T;pn -
/** snk{u/0Xm
* @return '/"M02a
* Returns the hasNextPage. Qre&N_
*/ tZ{q\+h
publicboolean getHasNextPage(){ |(8Hk@\CT>
return hasNextPage; )bN3-_
} cd%g]T)#1
r3bvuq,6$
/** A,CPR0g%
* @param hasNextPage
0{Ll4
* The hasNextPage to set. pUEok +
*/ W&re;?Z{ke
publicvoid setHasNextPage(boolean hasNextPage){ Q9'p3"yoE
this.hasNextPage = hasNextPage; $4~}_phi
} a_fW{;}[
O=?X%m #
/** y.]]V"'2
* @return ((IBaEq
* Returns the hasPrePage. !iz vY
*/ ^Th"`Av5
publicboolean getHasPrePage(){ Bc@r*zb
return hasPrePage; M>z7H"jCu
} 3*23+}^G
DO,&Foh\
/** /WgW e
* @param hasPrePage T|iF/p]F
* The hasPrePage to set. -v+^x`HR
*/ BNm va
publicvoid setHasPrePage(boolean hasPrePage){ Ol5xyj
this.hasPrePage = hasPrePage; }c#/1J7
} 9TN5|x
r0uXMr=Z96
/** wdDHRW0Y
* @return Returns the totalPage. JY8"TQ$x
* %[CM;|?B4
*/ {EHG |
publicint getTotalPage(){ =X'7V}Q}
return totalPage; w3cK:
C0
} "}aM*(l+\
_!p$47
/** eu|q
{p
* @param totalPage e;u8G/
* The totalPage to set. 4W-+k
*/ 1E_Ui1 [
publicvoid setTotalPage(int totalPage){ g~D6.OZU
this.totalPage = totalPage; Gv3Fg[MA@c
} /g7?,/vnZ
6zZR:ej
} ]TprPU39
P&`r87J
l%5%oN`4
[MP:Eeg
1e| M6*
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 ]<z(Rmn`Q
x#VUEu]8
个PageUtil,负责对Page对象进行构造: \ OINzfbr
java代码: i1Sc/
O7*i;$!R
3s$.l}
/*Created on 2005-4-14*/ To?
bp4
package org.flyware.util.page; a-2
{x2O
zW`koRH@
import org.apache.commons.logging.Log; U+M?<4J)"
import org.apache.commons.logging.LogFactory; cyeDZ)
0\^2HjsJ
/** ]Wm ?<7H
* @author Joa &nw~gSe
* Ou,_l
*/ ZTC1t_
publicclass PageUtil { z6r/
w
,PxQ[CGg
privatestaticfinal Log logger = LogFactory.getLog w o9f99
qyfxT Q5
(PageUtil.class); {S(T1ua
$s!meg@s
/** 7V``f:#d
* Use the origin page to create a new page FQ1oqqr
* @param page *lF%8k"Al
* @param totalRecords 3(p6ak2lv
* @return Q8:ocEhR
*/ o_m.MMEU
publicstatic Page createPage(Page page, int g$LwXfg
&J M;jSz
totalRecords){ }Cg~::,"
return createPage(page.getEveryPage(), N0hU~| /
IomJo
page.getCurrentPage(), totalRecords); #vwXx r
} Xe+FMbBco
@23x;x
/** =6YO!B>7
* the basic page utils not including exception 3mz>Y*^?0
Yk&{VXU<
handler l);8y5
* @param everyPage Y\\nJuJo
* @param currentPage RyD$4jk+T"
* @param totalRecords >vy+U
* @return page b<7qmg3
*/ kn|l 3+
publicstatic Page createPage(int everyPage, int @1Lc`;Wd
ibw;BU
currentPage, int totalRecords){ LdUpVO8)l
everyPage = getEveryPage(everyPage); 1zW6Pb
currentPage = getCurrentPage(currentPage); RtL'fd
int beginIndex = getBeginIndex(everyPage, _3[BS9
6s2g +[
currentPage); Ma#-'J
int totalPage = getTotalPage(everyPage, m/Z_ HER^
hh}EDnx
totalRecords); HpAZ{P7
boolean hasNextPage = hasNextPage(currentPage, \M@8# k|
bf(&N-"A
totalPage); Vrh],xK7
boolean hasPrePage = hasPrePage(currentPage); RVnYe='
RfRaWbn
returnnew Page(hasPrePage, hasNextPage, yG4MqR)J
everyPage, totalPage, JqZ5DjI:
currentPage, ztpb/9J9
k]g\`
gc
beginIndex); {jG`l$$
} wv-8\)oA
DBDfBb
privatestaticint getEveryPage(int everyPage){ jp`N%O]6
return everyPage == 0 ? 10 : everyPage; `_)dEu
} ;0gpS y$#
mo$*KNW%\
privatestaticint getCurrentPage(int currentPage){ k>`X!
"
return currentPage == 0 ? 1 : currentPage; &pz8vWCk
} yqwr0yDAl
v g]&T
privatestaticint getBeginIndex(int everyPage, int p6)UR~9Rs
p<e~x/@m*
currentPage){ l?[DO?m+R
return(currentPage - 1) * everyPage; _3S{n=9
} dz 2d`=`3
}JsdgO&z
privatestaticint getTotalPage(int everyPage, int l!,{bOZ
Ls{fCi/2F
totalRecords){ jFfki.H
int totalPage = 0; wQc w#
y[rLk
if(totalRecords % everyPage == 0) 9A!qg<
totalPage = totalRecords / everyPage; 3>6o=7/PU
else 'CX
KphlWs
totalPage = totalRecords / everyPage + 1 ; ewg WzB9c
< r~Tj
return totalPage; e hq6.+l
} }o4Cd$,8
M<Mr (z
privatestaticboolean hasPrePage(int currentPage){ !:5n
return currentPage == 1 ? false : true; ]u ';zJ.
} ]'q<wPi
YBP{4Rl
privatestaticboolean hasNextPage(int currentPage, pxj"<q`nw8
e)kf;Hkf
int totalPage){ U|nk86r
return currentPage == totalPage || totalPage == i}19$x.D`
8Yh2K}
0 ? false : true;
f/ZE_MN2
} f]}F_]
}UrtDXhA
xo$ZPnf(zv
} "K<