Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 hVAatn[
XlnSh<e
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 Mmg~Fn
vmh>|N4a7
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来
EWr7eH
? a)Fm8Y
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 UZ#oaD8H6
E^$8nqCL:
。 ".2d{B
D$@2H>.-
分页支持类: a&UzIFdB
X?XB!D7[
java代码: vPc*x5w-
CD%Cb53
g> ~+M
package com.javaeye.common.util; >|yP`m
DEbMb6)U
import java.util.List; kW1w;}n$
r?!:%L
publicclass PaginationSupport { ib~i ^_p
j=Izwt>
publicfinalstaticint PAGESIZE = 30; `oH4"9&]k3
EB*C;ms
privateint pageSize = PAGESIZE; -/V(Z+dj
!Q*w]
privateList items; p|8ZHR+
5-y*]:g(
privateint totalCount; Q J-|zS.W
'5LdiSk
privateint[] indexes = newint[0]; .g1x$cQ1<
VBw5[
privateint startIndex = 0; 0{vH .b
@
' QMcQvU
public PaginationSupport(List items, int nO!&;E&
9t6c*|60#n
totalCount){ RRV%g!
setPageSize(PAGESIZE); {L~dER
setTotalCount(totalCount); (CY D]n
setItems(items); t$wbwP
setStartIndex(0); _> x}MW+
} MfHOn YV
;+(VO
public PaginationSupport(List items, int {-8Nq`w
8Znr1=1
totalCount, int startIndex){ Tjq1[Wq
setPageSize(PAGESIZE); )GAlj;9A$
setTotalCount(totalCount); I`H&b&
.`
setItems(items); p:5NMo
setStartIndex(startIndex); d}':7Np
} ES AX}uF
d&raHF*
public PaginationSupport(List items, int iw3\`,5
{H)hoAenA
totalCount, int pageSize, int startIndex){ PJ0~ymE1~G
setPageSize(pageSize); m*A b<$y
setTotalCount(totalCount); Nr~!5XO
setItems(items); -0#"<!N
setStartIndex(startIndex); s_XCKhN:
} t(6]j#5
hTzj{}w
publicList getItems(){ cWZITT{A
return items; fmj}NV&ma
} G}g;<,g~
ix2i.wdD
publicvoid setItems(List items){ G3io!XM)D
this.items = items; 3*~`z9-z
} _ia&|#n
\} v@!PQl
publicint getPageSize(){ R/Bjc}J'
return pageSize; W&)f#/M8
} 7PMz6
PdqvXc
publicvoid setPageSize(int pageSize){ |ymW0gh7o$
this.pageSize = pageSize; '`2'<^yO
} cB){b'WJ
|ugdl|f
publicint getTotalCount(){ d{JI]
!
return totalCount; M$%ON>Kq
} #$xtUCqX
0*b8?e
publicvoid setTotalCount(int totalCount){ R9R~$@~G
if(totalCount > 0){ syW[uXNLZ
this.totalCount = totalCount; ^UJIDg7zS
int count = totalCount / iv_3R}IbX
f&4+-w.:V|
pageSize; eLPtdP5k
if(totalCount % pageSize > 0) >W] Wc4\
count++; y,`n9[$K\
indexes = newint[count]; X}(X\rp
for(int i = 0; i < count; i++){ Mb2a;s
indexes = pageSize * xaVX@ 3r.3
3]?='Qq.(
i; 8QJr!#u
} %<nGm\
}else{ a5/, O4Q
this.totalCount = 0; _]o7iqtv
} f|B\Y/*X
} 8A&N+sT
Yv]vl6<
publicint[] getIndexes(){ @NA+Ma{N
return indexes; #oTVfY#
} ,H"}Rw
a%m
)8N;C
publicvoid setIndexes(int[] indexes){ 4bGvkxZo`$
this.indexes = indexes; fDns r"T
} iu=Mq|t0
b}Gm{;s!
publicint getStartIndex(){ faRQj:R8
return startIndex; j:1N&7<FU
} Q"
h]p
IrCl\HQN
publicvoid setStartIndex(int startIndex){ ]lfufjj
if(totalCount <= 0) i=n;rT
this.startIndex = 0; [DjlkA/Zg
elseif(startIndex >= totalCount) N*Q*>q
this.startIndex = indexes }rmr0Bh
8BAe6-*S8
[indexes.length - 1]; vo
}4N[]Sb
elseif(startIndex < 0) dLH@,EKl)
this.startIndex = 0; U9`Co&Z2
else{ :*
|WE29U
this.startIndex = indexes B^TgEr
5g-1pzP9
[startIndex / pageSize]; l^bak]9 1
} j7g>r/1eE
} \kyoA
Z
{f4jE#a>v
publicint getNextIndex(){ SbUac<
int nextIndex = getStartIndex() + [AFR \{
Xmmj.ZUr
pageSize; x4kQG e(
if(nextIndex >= totalCount) ]lGkZyUhI
return getStartIndex(); zwQ#Yvd
else ]]r;}$
return nextIndex; 3;z1Hp2X
} ?
}ff O
ux^rF
publicint getPreviousIndex(){ !sI^Lh,Y
int previousIndex = getStartIndex() - jt6_1^
VSUWX1k4%
pageSize; #lMIs4i.
if(previousIndex < 0) 8v/,<eARJ
return0; MX#LtCG#V
else ZZkc) @
return previousIndex; A?n5;mvq#
} bydI+pVMo
Q1kM 4Up
} Qo3Enwap=
DQu)?Rsk
s^PsA9EAn
9UteD@*
抽象业务类 <6.`(isph
java代码: X^&--@l}T!
f\$_^dV
cY!Pv
/** 6:QlHuy0nH
* Created on 2005-7-12 t; #@t/`
*/ WS4DzuZZ
package com.javaeye.common.business; *7*cWO=
*=O3kUoL
import java.io.Serializable; D5Rp<PBq,
import java.util.List; >u0XV "g$
4yTgH0(T
import org.hibernate.Criteria; dhP")@3K;p
import org.hibernate.HibernateException; *@@dO_%6
import org.hibernate.Session; "-:g.x*d
import org.hibernate.criterion.DetachedCriteria; j)ln"u0R^B
import org.hibernate.criterion.Projections; "tJ[M
import vY4}vHH2
WyB^b-QmDh
org.springframework.orm.hibernate3.HibernateCallback; 73u97oe>1
import mcQ
A'
|DsT $~D
org.springframework.orm.hibernate3.support.HibernateDaoS Dh}d-m_5
Uv<nJM
upport; _@)-#7
^u90N>Dvq
import com.javaeye.common.util.PaginationSupport; q3v5gz^t
ntPX?/
public abstract class AbstractManager extends ^XYK
}J
+>yh`Zb
HibernateDaoSupport { yoieWnL}
<7Yh<(R e^
privateboolean cacheQueries = false; keQRS+9
t<}N>%ZO
privateString queryCacheRegion; k=p[Mlic/
t5 ^hZZ
publicvoid setCacheQueries(boolean !YO'u'4<aK
Mg}/gO%o
cacheQueries){ /={N^8^=x
this.cacheQueries = cacheQueries; u^'X>n)oL#
} +o,f:Ih
%)d7iT~M
publicvoid setQueryCacheRegion(String ' qT\I8%
9zx9t
queryCacheRegion){ p74Nd4U$s
this.queryCacheRegion = |#xBC+
3H>\hZ
queryCacheRegion; G<rAM+B*g
} ;ioF'ov
Zf??/+[
publicvoid save(finalObject entity){ fpO2bD%$8
getHibernateTemplate().save(entity); l LBzY`j
} G|t0no\f
iW9
publicvoid persist(finalObject entity){ 5TeGdfu @
getHibernateTemplate().save(entity); rkdA4'66w
} M djxTr^
N<KsQsy=
publicvoid update(finalObject entity){ `|92!Ej
getHibernateTemplate().update(entity); ;1_3E2E$
} Fwvc+ a
!"E/6z2&(k
publicvoid delete(finalObject entity){ 9G7Br s:
getHibernateTemplate().delete(entity); m9c`"!
} ^rY18?XC+:
y^Q);siSy
publicObject load(finalClass entity, sUiO~<Ozpk
oxnI/Z
finalSerializable id){ _T805<aUW\
return getHibernateTemplate().load %'X7T^uE
k7sD"xR3
(entity, id); p7izy$Wc
} f"AT@Ga]
y
La E]
publicObject get(finalClass entity, Be\@n xV[
Jko=E
finalSerializable id){ r/)ZKO,
return getHibernateTemplate().get <4zSh3
d}|z+D
(entity, id); T>hm\ !
} QaA?UzB
5xj8^W^G9
publicList findAll(finalClass entity){ ?V~vP%1
return getHibernateTemplate().find("from +RiI5.$=Z
$i!r> .Jo
" + entity.getName()); !`W0;0'Zg
} c|k(_#\B
{+Wknm%
publicList findByNamedQuery(finalString oxI?7dy5
7GErh,
namedQuery){ `6# s+JA[
return getHibernateTemplate VH+3o?nrT
1TGE>HG
().findByNamedQuery(namedQuery); w7q6v>
} 3U!=R-
|S<!'rY
publicList findByNamedQuery(finalString query, gg#lI|
~oK0k_{~
finalObject parameter){ 79o=HiOF99
return getHibernateTemplate zqQ[uO]m?
FKhgUnw
().findByNamedQuery(query, parameter); JnqP`kYbTE
} ofI,[z3
sint":1FC
publicList findByNamedQuery(finalString query, 'w<^4/L Q
^LXsU]
R
finalObject[] parameters){ 3Tw9Uc\vT
return getHibernateTemplate cT&lkS
O69TU[Vn
().findByNamedQuery(query, parameters); Be^"sC
} B*tQ0`
{F\P3-ub
publicList find(finalString query){ tehWGqx)
return getHibernateTemplate().find _^ n>kLd$
*xj2Z,u
(query); ^Q+z^zlC
} |942#rM
6g#E/{kQw
publicList find(finalString query, finalObject X(8LhsP
iO18FfM_
parameter){ nYvkeT
return getHibernateTemplate().find Lm1JiPs d
_)YB*z5
(query, parameter); U 17=/E
} &%(SkL_]
}w>UNGUMh
public PaginationSupport findPageByCriteria $
)2zz>4
pbwOma2
(final DetachedCriteria detachedCriteria){ 7*WO9R/
return findPageByCriteria &h7
n>q
b+f
'
(detachedCriteria, PaginationSupport.PAGESIZE, 0); $GhL-sqm
} 1>2
/1>
O CCC' k
public PaginationSupport findPageByCriteria ^'+#BPo9@
vD/l`Ib:
(final DetachedCriteria detachedCriteria, finalint 1g$xKe~]4
J{XRltI+
startIndex){ I1K %n'D
return findPageByCriteria Ri::Ek3qu
t!B,%,Dp
(detachedCriteria, PaginationSupport.PAGESIZE, :DuEv:;v
6O0aGJ,H
startIndex); _t4(H))]vG
} 55Mtjqfp
p`52
public PaginationSupport findPageByCriteria IEkbVIA(
INCD5dihJ
(final DetachedCriteria detachedCriteria, finalint CU*;>h1~u
a6It1%a+
pageSize, =n@\m<
finalint startIndex){ i!(5y>I_
return(PaginationSupport) xnw' &E
(VHPcoL
getHibernateTemplate().execute(new HibernateCallback(){ :ee vc7
publicObject doInHibernate R4DfqX
:RBeq,QaO
(Session session)throws HibernateException { >Af0S;S
Criteria criteria = OKu~Nb*
Z\n^m^Z
=
detachedCriteria.getExecutableCriteria(session); <1_3`t
int totalCount = qn}VW0!
iVmy|ewd
((Integer) criteria.setProjection(Projections.rowCount wCj)@3F
hwi_=-SL
()).uniqueResult()).intValue(); pm[i#V<v
criteria.setProjection 66_=bd(9
/h]ru SI
(null); iorQ/(
List items = y Tk1
z 61F q
criteria.setFirstResult(startIndex).setMaxResults e9QjRx
8"V1h72vcW
(pageSize).list(); Y%r>=Jvu6
PaginationSupport ps = qIh9? |`U
#nZPnc:
new PaginationSupport(items, totalCount, pageSize, P9q=tC3^
!g#y$
startIndex); KhL%ov
return ps; 1jPh0?BY
} l=$?#^^ /
}, true); Wk!<P"
nHd
} KAu>U3\/
>5Y.
public List findAllByCriteria(final 2nL*^hhh
TDy$Mv=y
DetachedCriteria detachedCriteria){ WWOjck#
return(List) getHibernateTemplate 0&tr3!h\
yDRi
().execute(new HibernateCallback(){ ^B7Ls{
publicObject doInHibernate ,*m|Lt%;R
(rBYE[@,
(Session session)throws HibernateException { E9@Sc>e
Criteria criteria = \uJ+~db=
Fp]ErDan
detachedCriteria.getExecutableCriteria(session); d%E*P4Ua
return criteria.list(); GR 1%(,
} Cyo:Da
A
}, true); Y'+KU/H
} B9c
gVTLj
~JS@$ #
public int getCountByCriteria(final qc';<
HTm`_}G9
DetachedCriteria detachedCriteria){ >8$Lqj^i
Integer count = (Integer) 4#ikdjB;
}` <DKO/
getHibernateTemplate().execute(new HibernateCallback(){ )YwLj&e4tf
publicObject doInHibernate K&T.~2'>
,,ML^ey
(Session session)throws HibernateException { _C|j"f/}
Criteria criteria = L2%D$!9
]bstkf}~u
detachedCriteria.getExecutableCriteria(session); K\mFb
return y!q`o$nK
b+$wx~PLi
criteria.setProjection(Projections.rowCount $IdU
eIhfhz?Q;#
()).uniqueResult(); 3'SN0VL
} ,TYFPulYcp
}, true); qT#NS&T!-
return count.intValue(); MfdkvJ'
} K @:t6
} ]xbMMax
pP#|: %
u4 ~.[3E*
kD)]\
)Z\Zw~L
/2tPd
用户在web层构造查询条件detachedCriteria,和可选的 J?hs\nA
-q&,7'V
startIndex,调用业务bean的相应findByCriteria方法,返回一个 ,F "P/`i'
ni<\AF]`
PaginationSupport的实例ps。 8u1?\SYnb
<vxTfE@>bp
ps.getItems()得到已分页好的结果集 }2Y`Lr
ps.getIndexes()得到分页索引的数组 (''w$qq"D
ps.getTotalCount()得到总结果数 7=qvu&{
ps.getStartIndex()当前分页索引 3[ xHY@c
ps.getNextIndex()下一页索引 k(@W
z>aCv
ps.getPreviousIndex()上一页索引 "}oo`+]Cq
'X?Iho
joNV4v"=`
8;,|z%rS"
X `F>kp1
1Cw$^jd
q &S@\b
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 O2U}jHsd
[EK^0g
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 b%d, X-3
`v'yGsIV
一下代码重构了。 lc]cs D
@iBmOt>3
我把原本我的做法也提供出来供大家讨论吧: yDj'')LOQg
Kp;a(D
首先,为了实现分页查询,我封装了一个Page类: SQMtR2
java代码: a=6@} l1<
`f<w+u
`L!L=.}4
/*Created on 2005-4-14*/ :z%Zur+n c
package org.flyware.util.page; $P2*qpqy
tC.etoh
/** $0+&xJVn
* @author Joa }U%T6~_wR
* c}H}fyu%n
*/ QC6QqcOX
publicclass Page { ]!s@FKC{;
btbuE
/** imply if the page has previous page */ z<J2e^j
privateboolean hasPrePage; RS@G.|
:u)Qs#'29
/** imply if the page has next page */ YHxQb$v)
privateboolean hasNextPage; qt4%=E;[
,4;'s
/** the number of every page */ B$S@xD $
privateint everyPage; ~~Rq$'q}
|Nadk(}
/** the total page number */ [/<kPi
privateint totalPage; }?HWUAL\
#5iwDAw:|r
/** the number of current page */ $Yw~v36`t/
privateint currentPage; xl,6O!aR
&[N_{O|
/** the begin index of the records by the current @xk ;]H80
t[AA=
query */ |qU~({=b
privateint beginIndex; 43~v1pf{!
H. o3d/8:
Ag&K@ %|*
/** The default constructor */ /_yAd,^-+
public Page(){ ,C:^K`k&
*r7%'K{C
} 6]4=8! J
EiyHZ
/** construct the page by everyPage <q&i"[^M
* @param everyPage %_~1(Glz
* */ {!! 8 *ix
public Page(int everyPage){ (`R
heEg@f
this.everyPage = everyPage; _x$\E
} }FX:sa?5
.B'ws/%5\
/** The whole constructor */ m/< @Qw
public Page(boolean hasPrePage, boolean hasNextPage, lsgZ
z f>(Y7M
xqauSW
int everyPage, int totalPage, (UTA3Db
int currentPage, int beginIndex){ WmRu3O
this.hasPrePage = hasPrePage; IGlM}
?x
this.hasNextPage = hasNextPage; }Nma %6PfV
this.everyPage = everyPage; V?-2FK]
this.totalPage = totalPage; E?VOst&
this.currentPage = currentPage; ]O0u.=1k
this.beginIndex = beginIndex; PWO5R]
} Q9Go}}n
Zv9%}%7p
/** Qv)DSl
* @return 7y$U$6
* Returns the beginIndex. 3 FMYs&0r4
*/ ^Cj3\G4,
publicint getBeginIndex(){ |D[LU[<C
return beginIndex; Or55_E
} E5a7p.
qa4j>;
/** hZ')<@hNP
* @param beginIndex pr1kYMrqri
* The beginIndex to set. `3z6y&dmx
*/ ]?NiY:v
publicvoid setBeginIndex(int beginIndex){ r?pN-x$M=
this.beginIndex = beginIndex; Dv4 H^
} c(!pcB8
b=SCyGxlZ5
/** q2;CvoF
* @return .k%/JF91n
* Returns the currentPage. 98vn"=3
*/ o)'06FF\$
publicint getCurrentPage(){ D4?cnwU
return currentPage; @ *5+ZAF
} v"<M
~9T)
H8m[:K]_H
/** V|/N-3M
* @param currentPage S7@/dHN
* The currentPage to set. cqcH1aSv
*/ '>T hn{
publicvoid setCurrentPage(int currentPage){ n8FIxl&u
this.currentPage = currentPage; 8:Dkf v
} J?1Eh14KZ
*|gl1S
/** P~PM $e
* @return f9O_M1=|lo
* Returns the everyPage. bP%X^q~]A
*/ ucJ8l(?Qc
publicint getEveryPage(){ L^2wEF
return everyPage; hI*6f3Vn(n
} QoMa+QTuc
9Fg:
/** .Y }k@T40a
* @param everyPage +6L.a3&(b
* The everyPage to set. /2 qxJvZ
*/ pi/&WMZ<
publicvoid setEveryPage(int everyPage){ A[^k4>
this.everyPage = everyPage; gm1RQ^n,@.
} aFL<(,~r
cmY `$=
/** )"63g
* @return V5 Gy|X
* Returns the hasNextPage. 8<J3Xe
*/ PK&X |
h
publicboolean getHasNextPage(){ ]1I-e2Q-J
return hasNextPage; OUN"'p%%
} yvnvI y
!P6?nS
/** ;Q[E>j?w=
* @param hasNextPage q3|SZoN
* The hasNextPage to set. BG6Lky/omz
*/ xFA`sAucr
publicvoid setHasNextPage(boolean hasNextPage){ l .m #
this.hasNextPage = hasNextPage; V=Z%y$1Bc
} Zj0h0Vt
7>EMr}f C
/** rAD4}A_w
* @return 4z^~,7J^
* Returns the hasPrePage. 5H(
]"C
*/ w*u.z(:a`
publicboolean getHasPrePage(){ iL~(BnsF
return hasPrePage; <1`MjP*w
} cVSns\QO
GbvbGEG
/** hK3Twzte
* @param hasPrePage
8L`wib2
* The hasPrePage to set. YI]/gWeu
*/ %2beoH'
publicvoid setHasPrePage(boolean hasPrePage){ ;x/.8fA
this.hasPrePage = hasPrePage; |_a^+!P
} _Ecs{'k
@k/|%%uP
/** ]puDqu5!
* @return Returns the totalPage. LwH+X:?i
* t{Ks}9B
*/ f+Fzpd?w S
publicint getTotalPage(){ d~T@fa
return totalPage; EWWCh0
{
} Jt)J1CAYo
{<cgeH
/** KSUhB
* @param totalPage +hs:W'`%
* The totalPage to set. +KIBbXF7
*/ _9S"rH[
publicvoid setTotalPage(int totalPage){ -@~4: o
this.totalPage = totalPage; A^4#6],%v
} JYLAu4s6
vpdT2/F
} 5{-54mwo
X#X/P
J~N!. i
qporH]J-E
Ze?H
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 }xgs]\^,73
yXf+dMv
个PageUtil,负责对Page对象进行构造: j3[kG#
java代码: G420o}q
Q=epUHFs
dSS Ai
|}
/*Created on 2005-4-14*/ nr&9\lG]G
package org.flyware.util.page; W^eQ}A+Z
R,-DP/ (im
import org.apache.commons.logging.Log; <4I`|D3@
import org.apache.commons.logging.LogFactory; E:P_CDSd]
"a<:fEsSE
/** C~M,N|m+^
* @author Joa qI[AsM+
* Io('kCOR;
*/ yx7y3TSq
publicclass PageUtil { 2TQ<XHA\
31p7oRzr
privatestaticfinal Log logger = LogFactory.getLog .la_u8A]
w(Q{;RNM;
(PageUtil.class); }RQHsS
SOS|3q_`
/** r4]hcoU
* Use the origin page to create a new page /5?tXH"
* @param page 66po SZR@
* @param totalRecords k?_uv
* @return k:&B
b"
*/ ]'z 5%'
publicstatic Page createPage(Page page, int `a@YbuLd
];QX&";Z
totalRecords){ +t(Gt0+
return createPage(page.getEveryPage(), d\tA1&k71
EEHTlqvR
page.getCurrentPage(), totalRecords);
$;)A:*e
} rt\.|Hr4s
+0:]KG!Zs.
/** LE g#W
* the basic page utils not including exception uao#=]?)
=!($=9
handler {=+'3p
* @param everyPage x(:alG%#
* @param currentPage Kw`}hSE>o
* @param totalRecords ~Vc`AcWP
* @return page Z_Y gV:jc
*/ _ujhD
publicstatic Page createPage(int everyPage, int WH.3
fhro"5/4
currentPage, int totalRecords){ O/oLQoH
everyPage = getEveryPage(everyPage); 161IWos
currentPage = getCurrentPage(currentPage); |
int beginIndex = getBeginIndex(everyPage, Q%0
N\
M[0NB2`Wp
currentPage); 9]|C$;kw@
int totalPage = getTotalPage(everyPage, y!~ }7=
(^~~&/U_U$
totalRecords); +y 48.5
boolean hasNextPage = hasNextPage(currentPage, mS+sh'VH
ZD<e$PxxCd
totalPage); O
2+taB
boolean hasPrePage = hasPrePage(currentPage); 3WPZZN<K9
/WI H#M
returnnew Page(hasPrePage, hasNextPage, t1!>EI`
everyPage, totalPage, kU{a!ca4
currentPage, ,/dW*B
H9[0-Ur5
beginIndex); @$;I%
} 4@Bl 1b[<
12}!oS~_
privatestaticint getEveryPage(int everyPage){ j!IkU}*c
return everyPage == 0 ? 10 : everyPage; &HqBlRo
} f/sLQdK,
-E.fo._L5
privatestaticint getCurrentPage(int currentPage){ Rvd'uIJ
return currentPage == 0 ? 1 : currentPage; (:RYd6i
} i`!>zl+D
xQNGlVipZ@
privatestaticint getBeginIndex(int everyPage, int p,3}A(>
352RJC
currentPage){ ;/!o0:m^I
return(currentPage - 1) * everyPage; 3E!3kSh|
} pzT`.#N:M
d}@n,3
privatestaticint getTotalPage(int everyPage, int @CKMJ^#|
[*r=u[67F
totalRecords){ cEGR?4z
int totalPage = 0; <lRjh7
)~ ^`[`
if(totalRecords % everyPage == 0) GGsAisF"N
totalPage = totalRecords / everyPage; MKX58y{+
else
4G j
totalPage = totalRecords / everyPage + 1 ; Fh}GJE
)c<[@::i
return totalPage; QvlVjDIy
} yL23Nqe
j/1f|x
privatestaticboolean hasPrePage(int currentPage){ Z5@E|O &
return currentPage == 1 ? false : true; mJsU7bD`
} oW6b3Q/B
|)[&V3+|
privatestaticboolean hasNextPage(int currentPage, R?#.z#
UTO$L|K
int totalPage){ r<