Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 %:oGyV7a
'TbA^U[
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 v4Nb/Y
U&B~GJT+
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 TyK;
q{
6J=~ *&
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 fA+M/}=
A 4&e#
。 z?7s'2w&{
]|732Z
分页支持类: {fX4
4CN8>J'-
java代码: zu;Yw=cM)
C g&1
wOa_"
package com.javaeye.common.util; ,*C^ixNE
q].C>R*ux8
import java.util.List; P-vA.7
NgH%
publicclass PaginationSupport { ob*2V!"
~" $9auQtC
publicfinalstaticint PAGESIZE = 30; ,fYO>l';`f
f0hi70\(X
privateint pageSize = PAGESIZE; m7 !l3W2
7l:H~"9r
privateList items; DPe`C%Oc1
>U) ,^H(
privateint totalCount; (+Uo;)~!YC
o/&:w z
privateint[] indexes = newint[0]; C8n1j2G\
50'6l
X(v,
privateint startIndex = 0; -R\}Q"
)s^XVs.-
public PaginationSupport(List items, int L\"=H4r
r@n%
totalCount){ @-MrmF)<U
setPageSize(PAGESIZE); {O"dj;RU
setTotalCount(totalCount); >>!+Ri\@
setItems(items); O &X-)g=
setStartIndex(0); _VM J q9.
} K:9.fTCs*
%%DK?{jo`
public PaginationSupport(List items, int f<zh-Gq
B!-W765Y
totalCount, int startIndex){ j#~4JGZt
setPageSize(PAGESIZE); i:zA(
setTotalCount(totalCount); *&AK.n_
setItems(items); z&-`<uV~
setStartIndex(startIndex); h?CNChRJs
} t8^*s<O
0\gE^=o[
public PaginationSupport(List items, int 1-JWqV(#?
}Rf }
iG
totalCount, int pageSize, int startIndex){ '7=*n_l
setPageSize(pageSize); $23R%8j
setTotalCount(totalCount); Y<M}'t
setItems(items); %EVg.k$
setStartIndex(startIndex); =+"XV8Fi,
} ](0A/,#q6
"/\:Fdc^
publicList getItems(){ g6*}&.&
return items; hpw;w}m
} Dic(G[
E]7G4
publicvoid setItems(List items){ /_56H?w\
this.items = items; R'80 {
} JUXK}0d%eN
W>,b1_k
c
publicint getPageSize(){ 4<O[d
return pageSize; 3g6R<Ez
} %_3{Db`R>
,$G89jSM
publicvoid setPageSize(int pageSize){ "iKK&%W
this.pageSize = pageSize; CP?\'a"Kt
} u(lq9; ;Th
()SG
publicint getTotalCount(){ v=L^jw
return totalCount; X'3F79`
} >%W"u`Q
I/@Xr
publicvoid setTotalCount(int totalCount){ Rn TPU`
if(totalCount > 0){ O=+C Kx@
this.totalCount = totalCount; *]H ./a:1
int count = totalCount / "w7:{E5e
!}vz_6)
pageSize; 8>epKFEg
if(totalCount % pageSize > 0) ?}Mv5SO
count++; 20Rgw
indexes = newint[count]; ,qr)}s-
for(int i = 0; i < count; i++){ iE&`Fhf?
indexes = pageSize * cq!>B{
D #A9
i; T8RQM1D_s
} 9^}GUJy?
}else{ }SOj3.9{c
this.totalCount = 0; XCt}>/"s\h
} %b_zUFHPp
} z24-hC
bGSgph
publicint[] getIndexes(){ _x>u"w
return indexes; /Ia#udkNMp
} U3Dy:K[
3*'!,gK~[
publicvoid setIndexes(int[] indexes){ HWHGxg['r
this.indexes = indexes; }LE/{]A
} 'Y-c*q
9> (8r+
publicint getStartIndex(){ M2m@N-+R
return startIndex; WM"I
r1
} *D9QwQ
_|
3W27R
publicvoid setStartIndex(int startIndex){ sDwSEg>#B
if(totalCount <= 0) t;?
q#!uc
this.startIndex = 0; V 1Fdt+#
elseif(startIndex >= totalCount) LOOv8'%O8
this.startIndex = indexes )>?K:y8I~
j0OxR.S
[indexes.length - 1]; N(IUNL
elseif(startIndex < 0) irL ehPX9
this.startIndex = 0; iKdC2m
else{ (yZ^Y'0
this.startIndex = indexes PmTA3aH
:oZ30}
[startIndex / pageSize]; Lu<'A4Q1
} SIg=_oa
} E>7[ti_p5
C f<,\Aav
publicint getNextIndex(){ 0phGn+"R
int nextIndex = getStartIndex() + h?idRaN_
b0
5h,
pageSize; %]:u ^\7
if(nextIndex >= totalCount) .E@yB`AR
return getStartIndex(); AMkjoy3+]
else >uI|S
return nextIndex; Kj}}O2
} 38f9jF%7j
dM$]OAT
publicint getPreviousIndex(){ /*8"S mte
int previousIndex = getStartIndex() - "V^(i%E;
'g$|:bw/
pageSize; `4$" mO>+
if(previousIndex < 0) 0BBWuNF.
return0; '|6j1i0x
else Yr0%ZYfN
return previousIndex; V%3K")
} z43 H]
UZXnABg,J
} {o;J'yjre1
g Ts5xDvJ
4sG^bZ,
M~^|dR)D
抽象业务类
9((v.
java代码: >
^D10Nf*
]ErAa"?
:vm*miOF
/** #2n>J'}
* Created on 2005-7-12 :r!nz\%WW
*/ ?}O\'Fa8
package com.javaeye.common.business; 7$/ O{GBJ
k%.IIVRx
import java.io.Serializable; 2N>:GwN
import java.util.List; !$fBo3!B_8
j'v2m 6/
import org.hibernate.Criteria; *)"`v]
import org.hibernate.HibernateException; (LGx;9S?
import org.hibernate.Session; "Z#&A
import org.hibernate.criterion.DetachedCriteria; Vw+U?
import org.hibernate.criterion.Projections; )|*HkdF`
import QQ pe.oF
;K`qSX;;c(
org.springframework.orm.hibernate3.HibernateCallback; 3F<My+J
import rrmr#a
)=2iGEVW
org.springframework.orm.hibernate3.support.HibernateDaoS cn Q(
G$kh
|r6<DEg
upport; R5|c4v{B
eB5;wH
import com.javaeye.common.util.PaginationSupport; |wWBV{^
`a
public abstract class AbstractManager extends F~&bgl[YZ
-3F|)qwK
HibernateDaoSupport { bW[Y:}Hk~
!,|yrB&`S
privateboolean cacheQueries = false; 8NA2C.gOZ
qm8[ ^jO&
privateString queryCacheRegion; \_0nH`
td%EbxJK]`
publicvoid setCacheQueries(boolean V"k*PLt
U^:+J-z{
cacheQueries){ 0~)cAKus
this.cacheQueries = cacheQueries; mD=x3d
} 1VH7z
O cd
^{u
publicvoid setQueryCacheRegion(String 1Hk`i%
uq{w1O5
queryCacheRegion){ 11O^)_|c
this.queryCacheRegion = -NHc~=m
<`n T+c
queryCacheRegion; jl%27Ld
} wxN'Lv=R
t4~Bn<=
publicvoid save(finalObject entity){ P^T]U bv"
getHibernateTemplate().save(entity); &n91f
} c|IH|y
%h(J+_"L6
publicvoid persist(finalObject entity){ Z;-=x p
getHibernateTemplate().save(entity); M qFuZg
} w+z~Mz}Vz
!S$LRm\'
publicvoid update(finalObject entity){ <"X\~
getHibernateTemplate().update(entity); 7c5+8k3
} Hq ]f$Q6:
.\".}4qQ
publicvoid delete(finalObject entity){ 1T!(M"'Ij
getHibernateTemplate().delete(entity); =0
mf
} Am{Vtl)i
nj]l'~Y0
publicObject load(finalClass entity, LJ\uRfs
p gWBW9\
finalSerializable id){ &,JrhMr\
return getHibernateTemplate().load
W0R<^5_
..)O/g.
(entity, id); )E;B'^RVR
} K!=Y4"5%
F^fL
publicObject get(finalClass entity, 6Q"fRXM
Gx,<|v
finalSerializable id){ 7A<X!a
return getHibernateTemplate().get "**Tw'
F-D9nI4{X
(entity, id); At3>
} `O/1aW1
4,4S5u[|
publicList findAll(finalClass entity){ 0g o{gUI
return getHibernateTemplate().find("from YHSdaocp
FhpS#,Y$
" + entity.getName()); $pr\"!|z
} KP,#x$Bg
1Tm,#o
publicList findByNamedQuery(finalString 1wAD_PI|BH
bvzNur_
namedQuery){ mmRxs1 0$
return getHibernateTemplate ;&RBg+Pr
%{Ib
().findByNamedQuery(namedQuery); sVWOh|O[W
} _c$l@8KS^
!8~A`
publicList findByNamedQuery(finalString query, AAuH}W>n
>BFUts%
finalObject parameter){ X\sO eb:]
return getHibernateTemplate YS],o'T
VC~1QPC9
().findByNamedQuery(query, parameter); }w&W\g+E$
} FabgJu
{8p<iY- %
publicList findByNamedQuery(finalString query, t}6QU
^__';! e
finalObject[] parameters){ .6C9N{?Tqf
return getHibernateTemplate %'+}-w
pUF$Nq>og
().findByNamedQuery(query, parameters); 2zE gAc
} %JoHc?
EC;R^)
publicList find(finalString query){ |2AMj0V~
return getHibernateTemplate().find \D67J239E
]"q9 ~
(query); ^jhc(ZW"
} i=3~ h Zl
g&&-
publicList find(finalString query, finalObject 9 n0?0mk
?$$Xg3w_#
parameter){ -,:^dxE'
return getHibernateTemplate().find }ZqnsLu[)
b,h@.s
(query, parameter); }jdMo83
} @qUgp*+{
+-2W{lX
public PaginationSupport findPageByCriteria '<=77yDg
)>"|<h.2]
(final DetachedCriteria detachedCriteria){ 10}<n_I
return findPageByCriteria -8zdkm8k
tEuVn5
(detachedCriteria, PaginationSupport.PAGESIZE, 0); :Eb=jWA
} Y'
FB
{
80_}}op?8
public PaginationSupport findPageByCriteria E5iNuJj=f
1L;3e@G
(final DetachedCriteria detachedCriteria, finalint .o#A(3&n
nQ +$
startIndex){ ZX0#I W
return findPageByCriteria 0q6xXNAX
SL[ EOz#
(detachedCriteria, PaginationSupport.PAGESIZE, n?(sn
zQ~N(Jj?h
startIndex); ~~r7TPq
} u7nTk'#r
W*;r}!ro
public PaginationSupport findPageByCriteria 4++
&P9
mswAao<y&x
(final DetachedCriteria detachedCriteria, finalint 7?@ -|{
QtHK`f>4#n
pageSize, [zJ|61^
finalint startIndex){ joA>-k04
return(PaginationSupport) lJvfgP-j
^#gJf*'UE
getHibernateTemplate().execute(new HibernateCallback(){ B%n|%g6K|h
publicObject doInHibernate `(uN_zvH
ZyX+V?4
(Session session)throws HibernateException { N(J'h$E
Criteria criteria = A1Es>NK[qW
XOL_vS24
detachedCriteria.getExecutableCriteria(session);
MFyi#nq
int totalCount = U6?3 z
`T,^os#6
((Integer) criteria.setProjection(Projections.rowCount 7 I/a
VX:Kq<XwQ
()).uniqueResult()).intValue(); #;0F-pt
criteria.setProjection z!G?T(SpA
XwZR
Kh\>=
(null); ,K15KN.'
List items = RF[Uy?es
qm/#kPlM
criteria.setFirstResult(startIndex).setMaxResults M{t/B-'4
:z-?L0C=0
(pageSize).list();
CH$K_\
PaginationSupport ps = gq~K(Q<O<
b5)1\ANq
new PaginationSupport(items, totalCount, pageSize, NT=)</v
)8E[xBaO
startIndex); eGW
h]%
return ps; 3Yf~5csY
} 7q&T2?GEN
}, true); tISb' ^T
} Nd
He::
5SEGV|%
public List findAllByCriteria(final LEg ?/!LIT
kq*IC&y
DetachedCriteria detachedCriteria){ ~^/BAc
return(List) getHibernateTemplate KBDNK_7A
&})Zqc3Lqk
().execute(new HibernateCallback(){ Tmk'rOg5
publicObject doInHibernate 9^CuSj
5mX"0a_Q
(Session session)throws HibernateException { 0DaKd<Scv
Criteria criteria = 0
s@>e
D}rnpwp{
detachedCriteria.getExecutableCriteria(session); NC3XJ
4
return criteria.list(); A;TNR
} qtjx<`EK>
}, true); m 0]1(\%
} Am<){&XT
]
qzWnl[3
public int getCountByCriteria(final +^q-v-
'soll[J
DetachedCriteria detachedCriteria){ C:_-F3|]cJ
Integer count = (Integer) HggINMG
\0;EHB
getHibernateTemplate().execute(new HibernateCallback(){ GPrq(
publicObject doInHibernate a+B3`6
xB_78X1
(Session session)throws HibernateException { =)f.Yf|A*
Criteria criteria = l'1_Fb
*-3*51 jW
detachedCriteria.getExecutableCriteria(session); '#Q\p6G&_
return WeIi{<u8R
H on,-<
criteria.setProjection(Projections.rowCount UW Px|]RC
b?-KC\}v
()).uniqueResult(); NftR2
} %~\I*v04
}, true); -+0!Fkt@,
return count.intValue(); &23{(]eO
} geNvp0
} V8G.KA "
~3$:C#"Dl
be]Zx`)k
gWl49'S>+
82YZN5S3]3
8"ulAx74>
用户在web层构造查询条件detachedCriteria,和可选的 M
y!;N1
POQ4&ChA
startIndex,调用业务bean的相应findByCriteria方法,返回一个 ~PX#' Jr
K7ZRj\(CJv
PaginationSupport的实例ps。 ,IPryI
/BrbP7
ps.getItems()得到已分页好的结果集 g{Hb3id9
ps.getIndexes()得到分页索引的数组 L,3%}_
ps.getTotalCount()得到总结果数 ,Qt2 ?
ps.getStartIndex()当前分页索引 wc ;^C?PX
ps.getNextIndex()下一页索引 ]YUst]gu3
ps.getPreviousIndex()上一页索引 QSvgbjdE
([NS%
(/|f6_9!
*X2dS
{
RaA7 U
={I(i6
[ z{}?
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 8p]Krs:
)5x,-m@
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 rs@qC>_C0
`jT1R!$3F
一下代码重构了。 s-S|#5
{'o\#4Wk
我把原本我的做法也提供出来供大家讨论吧: zLjQ,Lp.I
H,)2Ou-Wn
首先,为了实现分页查询,我封装了一个Page类: J6J;
!~>_
java代码: mSp;(oQ
CMfR&G,)
-V52?Hq
/*Created on 2005-4-14*/ }^PdW3O*m,
package org.flyware.util.page; 2*Mu"v,
e9eBD
/** ;h4w<OqcM
* @author Joa | EFbT>
* @|}=W Q
*/ `7_s@4:
publicclass Page { `%.x0~ih
k&o1z'<C
/** imply if the page has previous page */ gP=@u.
privateboolean hasPrePage; Gx-tPW}
o
vX9
/** imply if the page has next page */ ETaLE[T%1
privateboolean hasNextPage; ~ym-Szo
?Q: KW
/** the number of every page */ :2MHx}]il
privateint everyPage; 5dhT?/qvc
xilA`uw`1
/** the total page number */ HNV"'p;
privateint totalPage; Cc` )P>L
w]Ci%W(
/** the number of current page */ Q".AmHn
privateint currentPage;
MU~nvs;:
FhMl+Ou
/** the begin index of the records by the current zqb3<WP"
WQ1*)h8,9
query */ ^/jALA9!
privateint beginIndex; }"AGX
E"b"VB
E#,n.U>#)
/** The default constructor */ B1 [O9 U:
public Page(){ G `JXi/#`
2_;3B4GDF
} .8Gmy07
/qO?)p3gk
/** construct the page by everyPage EXT_x q
* @param everyPage fu7J{-<<R
* */ qjd8Q
public Page(int everyPage){ t5
this.everyPage = everyPage; #'Lt_Yf!
} =]F15:%Zq
\B
D'"
/** The whole constructor */ .p(~/MnO
public Page(boolean hasPrePage, boolean hasNextPage, =j !Ruy1
.{LJ
LxxFosi8
int everyPage, int totalPage, Fd@:*ER
int currentPage, int beginIndex){ Ov9kD0S
this.hasPrePage = hasPrePage; Zkn1@a
this.hasNextPage = hasNextPage; >-YWq
this.everyPage = everyPage; ,a?$F1Z-
this.totalPage = totalPage; "e~"-B7(\Y
this.currentPage = currentPage; oj~0zJI
this.beginIndex = beginIndex; Y7
`i~K;
} 9oJ=:E~CP
U/bQ(,3}
/** e025m}%SU
* @return Gv zw=~8
* Returns the beginIndex. '}T6e1#JV
*/ =H2.1 :'
publicint getBeginIndex(){ E cW$'>^
return beginIndex; cakb.Q
} ,-{2ai_
$@:z4S(
/** p*Hbc|?{Q&
* @param beginIndex c`h/x>fa
* The beginIndex to set. C/x<_VJzN/
*/ x?MSHOia`P
publicvoid setBeginIndex(int beginIndex){ I!sB$=n
this.beginIndex = beginIndex; zE\@x+k.
} {9C+=v?
O8%Y .SK
/** >E`p@
e+
* @return b_T?jCyW
* Returns the currentPage. fd Rw:K8
*/ G'
'l,\3
publicint getCurrentPage(){ h_:|H8t;w
return currentPage; 1V37%
D
} V_"K
$zuemjW3p
/** _P*<T6\J>
* @param currentPage R)?zL;,x
* The currentPage to set. ^UAL5}CQt
*/ RxVf:h'l
publicvoid setCurrentPage(int currentPage){ vS|uN(a.P
this.currentPage = currentPage; `*=Tf
} kM
T73OI>_
-] .Y";
/** `+/xA\X]
* @return Ge]2g0
* Returns the everyPage. ;f7;U=gl,
*/ ) b
vZ~t+^
publicint getEveryPage(){ v"&Fj
return everyPage; E)dV;1t
} )m Uc
!TP
dT9!gNvQ
/** 6{r^3Hz
* @param everyPage n(#159pZ
* The everyPage to set. -S"$S16D
*/ N{<=s]I%x
publicvoid setEveryPage(int everyPage){ s]=s|
this.everyPage = everyPage; ;h"?h*}m!\
} 1wpeYn7>W
duKR;5:
/** YkKq}DXj
* @return <([1(SY2e
* Returns the hasNextPage. .iB?:
*/ .V?i 3
publicboolean getHasNextPage(){ m1k+u)7kD
return hasNextPage; FV&&
} 8U07]=Bt<
+ fQ=G/
/** ddMSiwbY)
* @param hasNextPage r>hkm53
* The hasNextPage to set. Ta38/v;S
*/ (f 0p
publicvoid setHasNextPage(boolean hasNextPage){ TB
gD"i-
this.hasNextPage = hasNextPage; OwwlQp ~!J
} EQkv&k5X
\Om<
FH}
/** 6uYCU|JsU
* @return z Lw=*
* Returns the hasPrePage. VR/>V7*7@
*/ tndtwM*B'
publicboolean getHasPrePage(){ 5CxD ys&<
return hasPrePage; b0CtQe
} hY.zwotH
|-hzvuSX
/** #KonVM(`
* @param hasPrePage f.`noZN
* The hasPrePage to set. -O2ZrJ!q
*/ CqUK[#kW(
publicvoid setHasPrePage(boolean hasPrePage){ T3o}%wGW
this.hasPrePage = hasPrePage; 'Dq!o[2y
} 7B$iM,}.b
?6!7fs,
/** (L?fYSP!
* @return Returns the totalPage. yFT)R hN
* "$?f&*
*/ ?#^_yd|<
publicint getTotalPage(){ Z4Nl{
6
return totalPage; bGvALz'
} V@Z8t8
Z~tOR{q
/** zQ$*!1FmN
* @param totalPage [e
)j,Q1
* The totalPage to set. 1.0S>+^JE
*/ Z,Z34:-
publicvoid setTotalPage(int totalPage){ )z9)oM\
this.totalPage = totalPage; j5ZeYcQ-
} t)LD-%F
b]s*z<|%
} .N99=%[}h
H'E>QT
AlNiqnZ
}!\ZJo a
FrO)3 1z
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 Vt:]D?\3
m<wng2`NTv
个PageUtil,负责对Page对象进行构造: hbhh
m
java代码: q"5iza__H
|~bl%g8xP
E ?(
/*Created on 2005-4-14*/ 5Cd>p<
package org.flyware.util.page; $
+h~VC
tm~V+t!mj
import org.apache.commons.logging.Log; DD\:glo
import org.apache.commons.logging.LogFactory; I_J;/!l=
0hXI1@8]`
/** mu2r#I
* @author Joa ^o]ZDc
* KAm v7
*/ 1e*+k$-{
publicclass PageUtil { FW:x XK
T=}(S4n#BX
privatestaticfinal Log logger = LogFactory.getLog *doK$wYP
-cCujDM#T
(PageUtil.class); |eIN<RY5
R74kt36M
/** 1@C0c%
* Use the origin page to create a new page P=eVp(/x
* @param page p6]4YGw*^
* @param totalRecords :04sB]H
* @return
4G&E?
*/ RV5X0
publicstatic Page createPage(Page page, int Crmxsw.W^Y
A1:<-TF6^p
totalRecords){ , gk49z9
return createPage(page.getEveryPage(), 7_taqcj
QF(.fq8, U
page.getCurrentPage(), totalRecords); |k:MXI
} Qj?+R F6(
[y|"iSD
/** GFOd9=[
* the basic page utils not including exception !@!,7te
0&Q-y&$7
handler Mf%0Cx `
* @param everyPage v`MCV29!}
* @param currentPage 0b9K/a%sQv
* @param totalRecords I0=YIcH5
* @return page v2:A 4Pd:+
*/ zR(}X8fP
publicstatic Page createPage(int everyPage, int yHl1:cf(y
_6&x$*O
currentPage, int totalRecords){ y]aV7
`]
everyPage = getEveryPage(everyPage); q-gN0"z^6$
currentPage = getCurrentPage(currentPage); bR6.Xdt.n
int beginIndex = getBeginIndex(everyPage, ps"DL4*
N;7Xt9l
currentPage); m5SJB]a/
int totalPage = getTotalPage(everyPage, 7.$0LN/a!Z
pw*<tXH!
totalRecords); V} Y %9V
boolean hasNextPage = hasNextPage(currentPage, 7y:%^sl
u?Jw) `
totalPage); XP<wHh
boolean hasPrePage = hasPrePage(currentPage); Zf}]sW$H
6Yebc_, R
returnnew Page(hasPrePage, hasNextPage, eKNZ?!c=
everyPage, totalPage, :}0y[qc3
currentPage, jKZJ0`06q
"tB"C6b
beginIndex); y|U3
} Tw"u{%t
9nlfb~F~P
privatestaticint getEveryPage(int everyPage){ 08{0i,Fs
return everyPage == 0 ? 10 : everyPage; EV|
6._Z(D
} cdfJa
Mib(J+Il
privatestaticint getCurrentPage(int currentPage){ %mPIr4$Pg
return currentPage == 0 ? 1 : currentPage; '9%72yG
} U7O~ch[,
Bs(\e^}
privatestaticint getBeginIndex(int everyPage, int m!5P5U
x
5v"QKI
currentPage){ YU.aZdA&V3
return(currentPage - 1) * everyPage; s~$ZTzV
} f/RzE
5mUHk]W
privatestaticint getTotalPage(int everyPage, int lN#W
v{
Md4p
totalRecords){ Tz3 L#0:j
int totalPage = 0; 9 o6ig>C
w~hO)1c],:
if(totalRecords % everyPage == 0) B}8xA}<
totalPage = totalRecords / everyPage; &{NN!X
else g-"@%ps
totalPage = totalRecords / everyPage + 1 ; x zu)``?
VVO C-:
return totalPage; P:vAU8d>
} {/G~HoY1i
)WavG1
privatestaticboolean hasPrePage(int currentPage){ 4;'o`K~*
return currentPage == 1 ? false : true; Aq%TZ_m
} __M(dN(^
+<7~yZ[Z8
privatestaticboolean hasNextPage(int currentPage, u )PB@
#4iSQ$0
int totalPage){ m`gH5vQa
return currentPage == totalPage || totalPage == e/JbRbZX
5xe}ljo
0 ? false : true; &?flH;
} L,c@Z@
r18euB%
reJw&t