Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 c z'5iK
Ol@_(U
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 /n5n
)P@L
u?H 2%hD
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来
6ghx3_%w
D ]03eu
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 't (O$
VD7i52xS
。 /f{$I
U.oksD9v
分页支持类: _t>"5s&i
)}lRd#V
java代码: ^))RM_ic
p<GR SJIk=
</~ 6f(mg
package com.javaeye.common.util; Zj9c9
C*kK)6v`
import java.util.List; Kuw^qX"
ocR dbmS
publicclass PaginationSupport { [3>GGX[Ic
[0;buVU.
publicfinalstaticint PAGESIZE = 30; /R8p]
yt0,^*t_
privateint pageSize = PAGESIZE; S;\R!%t_
@tT-JwU
privateList items; hsNWqk qys
D{7w!z
privateint totalCount; Qst$S} n
oF:v
JDSS
privateint[] indexes = newint[0]; X ]j)+DX>
A#@_V'a8
privateint startIndex = 0; Ub$n |xn
,J=P,](
public PaginationSupport(List items, int hwnJE958L
YlK7;yrq(
totalCount){ ]7 GlO9
setPageSize(PAGESIZE); #@.-B,]
setTotalCount(totalCount); !X^Ce)1K
setItems(items); qa'gM@]
setStartIndex(0); PR7f(NC
} >4i>C
1}m3;
public PaginationSupport(List items, int IVvtX}
l&(l$@t
totalCount, int startIndex){ 3c'#6virz
setPageSize(PAGESIZE); 8;gXg
setTotalCount(totalCount); 8F5|EpB9M
setItems(items); 'xK.UI
setStartIndex(startIndex); UmU:j@xvg
} S]/b\B.h+
n%%7KTqu
public PaginationSupport(List items, int ?;ukvD
-.I4-6~
totalCount, int pageSize, int startIndex){ h) (*q+a
setPageSize(pageSize); !kuX,*}q
setTotalCount(totalCount); /8yn vhF#
setItems(items); QrYa%D+
setStartIndex(startIndex); eCbf9B
} p^)B0[P9
Z9`TwS@x[
publicList getItems(){ ~W0(1#
i
return items; ~eh0[mF^]
} 0DPxW8Y -`
sp9W?IJ 6c
publicvoid setItems(List items){ wVl+]zB
this.items = items; GC@+V|u
} =6 r:A<F!n
7N8H)X
publicint getPageSize(){ J1ON,&[J
return pageSize; BzJ;%ywS
} A&5:ATQ/|
5N7H{vT_
publicvoid setPageSize(int pageSize){ D/(CU#i"
this.pageSize = pageSize; *#U+qgA;`
} _c(4o:
f{#j6wZM
publicint getTotalCount(){ Gctsp2ndW
return totalCount; |9K<-yD
} _wDS#t;!M
g(x9S'H3l
publicvoid setTotalCount(int totalCount){ s Kicn5
if(totalCount > 0){ ?knYY>Kzh1
this.totalCount = totalCount; -~f511<
int count = totalCount / ]B\H~Kn
N!&:rK
pageSize; _RkuBOv@e
if(totalCount % pageSize > 0) f2I6!_C!+
count++; myFAKRc
indexes = newint[count]; v}JD2.O+
for(int i = 0; i < count; i++){ yzsab ^]
indexes = pageSize * K{ fsn4rk
&K+0xnUH
i; RD,5AShP
} qPGuo5^
}else{ xJ8%<RR!t
this.totalCount = 0; X|LxV]
} ;QCrHqRT`
} _banp0ywS
W;6vpPhg#!
publicint[] getIndexes(){ c:!z O\P#
return indexes; cu!W4Ub<
} )~)*=u/
G[Lpe
publicvoid setIndexes(int[] indexes){ N5zlT
this.indexes = indexes; Y]|:?G7l]
} [/M^[p
E6B!+s!]
publicint getStartIndex(){ 9O.Y OiW
return startIndex; uGN^!NG-0
} XM1`x
qO1tj'U<
publicvoid setStartIndex(int startIndex){ \00DqL(Oj`
if(totalCount <= 0) vxQ8t!-u
this.startIndex = 0; ~p0c3*
elseif(startIndex >= totalCount) una%[jTc
this.startIndex = indexes nKr9#JebRC
Fm_y&7._
[indexes.length - 1]; FCj{AD
elseif(startIndex < 0) &;TJ~r#K
this.startIndex = 0; ti5HrKIw
else{ F^$led1/F
this.startIndex = indexes MxQ?Sb%Gka
[4&#*@
[startIndex / pageSize]; eW'2AT?2H%
} B?rSjdY4
} bizTd
#V02hs1
publicint getNextIndex(){ d%@~mcH>
int nextIndex = getStartIndex() + 1nknSw#
{:nQl}
pageSize; HmmS(fU
if(nextIndex >= totalCount) g9fq5E<G
return getStartIndex(); `Hx~UH)
else @wmi5oExc
return nextIndex; fU3`v\X
} 7}O.wUKw%
D#A~Nbc
publicint getPreviousIndex(){ }ArpPU
:]
int previousIndex = getStartIndex() - {Rq1HH
~ I}9;XT
pageSize; ?|{XZQ~
if(previousIndex < 0) 3oZ=k]\
return0; p{dwZ_gl
else eas:6Q)
return previousIndex; v60^4K>
} 9i5,2~
rX7QbAB
} s?Uh| BfB
r`S< A;
&ZHC-qMRK
)}%O>%
抽象业务类 wXjFLg!g?
java代码: ^E`(*J/o
fQK"h
/2M.~3gQ
/** rx"s!y{!-
* Created on 2005-7-12 RR;AJ8wd
*/ `i
+g{kE2M
package com.javaeye.common.business; ysIh[1E~%:
s^OO^%b
import java.io.Serializable; n(nBRCG)o
import java.util.List; Y<"7x#AB!
cV{%^0?D
import org.hibernate.Criteria; 5v)(8|.M
import org.hibernate.HibernateException; }ov&.,vQ
import org.hibernate.Session; Dq@2-Cv
import org.hibernate.criterion.DetachedCriteria; Z BUArIC
import org.hibernate.criterion.Projections; {yU+)t(.
import
>YtdA
mV^Zy
org.springframework.orm.hibernate3.HibernateCallback; dBV7Te4L
import l%R50aL
BElJB&I
org.springframework.orm.hibernate3.support.HibernateDaoS DD9 ?V}Yx
nfW&1a
upport; q}BzyC=:n
gnp~OVDqfL
import com.javaeye.common.util.PaginationSupport; ^[-el=oKn0
;8S/6FI
public abstract class AbstractManager extends >N\0"F7.
&M/0g]4p
HibernateDaoSupport { kU-t7'?4
w6dFb6~R
privateboolean cacheQueries = false; 9vNkZ-1
+ 1IQYa|
privateString queryCacheRegion; /"H`.LD.?
w=h1pwY
publicvoid setCacheQueries(boolean f~OU*P>V@
Xb
!MaNm)
cacheQueries){ P #F=c34u
this.cacheQueries = cacheQueries; vzel#
} CBQhIvq.d
SQ,?N
XZ
publicvoid setQueryCacheRegion(String <!$:8ls
(KZHX5T=
queryCacheRegion){ dm"n%
this.queryCacheRegion = [ao
U5;7
O|A_PyW
queryCacheRegion; ; R=.iOn
} BG^C9*ZuP
R.[Z]-X
publicvoid save(finalObject entity){ _{vkX<s
getHibernateTemplate().save(entity); `dMqe\o%!
} F["wDO
SjjIr ^
publicvoid persist(finalObject entity){ *{undZ?(>
getHibernateTemplate().save(entity); `u!l3VZ/4
} ,
$Qo =
{ wF&+kH3
publicvoid update(finalObject entity){ V~ ~=Qp+.
getHibernateTemplate().update(entity); Ogt]_
} !{n<K:x1
6J~12TU,
publicvoid delete(finalObject entity){ X1[CX&Am
getHibernateTemplate().delete(entity); j#~Jxv%n
} gw`B "c|
Ee1LO#^_6
publicObject load(finalClass entity, ^[Ua46/" m
)yY6rI;:
finalSerializable id){ b5IA"w
return getHibernateTemplate().load =&0wr6
Bx"7%[
(entity, id); Glq85S
} ]nQt>R p_
r!P}u
publicObject get(finalClass entity, 2>-S-;i
o47r<>t
finalSerializable id){ RO0>I8c1c
return getHibernateTemplate().get 3Y)PU=
S0g'r
!;6
(entity, id); @ DZD
} O9'x-A%
;
UiwH
publicList findAll(finalClass entity){ MRr</o
return getHibernateTemplate().find("from \ 6EKgC1
LAx4Xp/
" + entity.getName()); 1iL'V-y
} gx03xPeu
Z=4{Vv*
publicList findByNamedQuery(finalString ,y9iKkg
lT\a2.E
namedQuery){ '6$*YN&5
return getHibernateTemplate ODc9r }
;o/>JHGj
().findByNamedQuery(namedQuery);
Pi%%z
} d0hhMx6$
Y
$g$x<7
publicList findByNamedQuery(finalString query, p\C%%
wpA`(+J
finalObject parameter){ % |q0-x
return getHibernateTemplate G>YAJo
(vR 9H(#
().findByNamedQuery(query, parameter); a</D_66
} ?Y:x[pOe
;)Kh;;e
publicList findByNamedQuery(finalString query, &`Y!;@K9W#
xX0-]Y h:
finalObject[] parameters){ Cp^@zw*/
return getHibernateTemplate d"G+8}.4
(nW67YTr
().findByNamedQuery(query, parameters); h0?2j)X_
} =O _z(
d1!i(MaV!
publicList find(finalString query){ Mh(]3\
return getHibernateTemplate().find H?}[r)|(3i
P+MA*:
(query); A392=:N+Q
} nI*/Mhx
FZd.L6q
publicList find(finalString query, finalObject Sj'ht=
O_$dI*RK
parameter){ VZ>On$hp
return getHibernateTemplate().find RjJU4q
+^rh[>W
(query, parameter); W$JebW<z(
} 9 7%0;a8
JB</euyV
public PaginationSupport findPageByCriteria BY\:dx)mK
2LCB])X
(final DetachedCriteria detachedCriteria){ M)?dEgU}M
return findPageByCriteria ~mV"i7VX
g#NZ ,~
(detachedCriteria, PaginationSupport.PAGESIZE, 0); _a_xzv'
} YL
jHt\
H@X oqgI
public PaginationSupport findPageByCriteria _!xD8Di#
QU{Ech'
(final DetachedCriteria detachedCriteria, finalint r8xyd"Axy
c~A4gtB=
startIndex){ "HD+rmUEH
return findPageByCriteria sDqe(x}a
{qKxz9.y
(detachedCriteria, PaginationSupport.PAGESIZE, eRbGZYrJ
^n#1<K[E
startIndex); ]!:oYAm
} s/"&9F3
Zn:R
PMk*
public PaginationSupport findPageByCriteria y`e4;*1
f0+2t.tj
(final DetachedCriteria detachedCriteria, finalint A]`El8_t"
})vOaYT|-
pageSize, !.7udYmB
finalint startIndex){ D0Z\Vvy
return(PaginationSupport) He0=-AR8
2Zuq?1=
getHibernateTemplate().execute(new HibernateCallback(){ ,O1O8TwUB0
publicObject doInHibernate m,3er*t{
<0|9Tn2O
(Session session)throws HibernateException { `\=Gp'&Q+
Criteria criteria = QH4wUU3X
w&Dv8Wv+Oq
detachedCriteria.getExecutableCriteria(session); @J[6,$UVu
int totalCount = R7oj#
T1B|w"In
((Integer) criteria.setProjection(Projections.rowCount dGZntT2D
P7r'ffA
()).uniqueResult()).intValue(); nGZX7Fx5
criteria.setProjection R~L0{`
0
g*\/N,"z
(null); \^+ILYO:$
List items = <j}lp-
!=Y;h[J.p
criteria.setFirstResult(startIndex).setMaxResults 7>o.0
Ocg"M Gb
(pageSize).list(); ?<X(]I.j
PaginationSupport ps = 6XEZ4QP}
9z
m|Lbj
new PaginationSupport(items, totalCount, pageSize, ?{o/I\\
[}nK"4T"Ri
startIndex); (lA.3 4.p
return ps; Q+|{Bs)6i1
} dtM[E`PL
}, true); Pvo#pY^dXX
} rt]S\
ske@uzAz
public List findAllByCriteria(final -ML6d&cm
CF
y}r(q
DetachedCriteria detachedCriteria){ n_[i0x7#
return(List) getHibernateTemplate xIbMs4'iEx
Ar9nBJ`
().execute(new HibernateCallback(){ /%x7+Rl\-^
publicObject doInHibernate jX=lAs~6
/z."l!u6
(Session session)throws HibernateException { \L!uHAE2a
Criteria criteria = ,a|@d}U
hp!d/X=J_
detachedCriteria.getExecutableCriteria(session); iCG`3(xL
return criteria.list(); =?@Q-(bp
} khd5 Cf[
}, true); 'aJgLws*w
} Lrz3
~m=EM;
public int getCountByCriteria(final I\P Bu$Ww
2F_
R/{D
DetachedCriteria detachedCriteria){ ?v]-^X=&
Integer count = (Integer) rp!
LP#*
O0~vf[i];
getHibernateTemplate().execute(new HibernateCallback(){ N?r>%4
publicObject doInHibernate >}+Q:iNQ)2
a^nAZ
(Session session)throws HibernateException { hAR?
t5c
Criteria criteria = 8 ,}ikOZ?
#~Q=h`9
detachedCriteria.getExecutableCriteria(session); Bl.u=I:Y4
return eBB:~,C^q.
:1fagaPg
criteria.setProjection(Projections.rowCount
I8m:3fL"
^%bBW6eZ
()).uniqueResult(); >mu)/kl
} I?Y d
}, true); 54p tP
return count.intValue(); sLh0&R7
} Iq'O
} ,4F,:w
X33v:9=
N{akg90
HQVh+ (
0A$SYF$O+[
oN2=DYC41
用户在web层构造查询条件detachedCriteria,和可选的 iSp
e=f .y<
startIndex,调用业务bean的相应findByCriteria方法,返回一个 I=dGq;Jaz
?qHF}k|
PaginationSupport的实例ps。 eMMx8E)B
pu;3nUH
ps.getItems()得到已分页好的结果集 9/TY\?U
ps.getIndexes()得到分页索引的数组 a<Uqyilm
ps.getTotalCount()得到总结果数 9w^zY;Y
ps.getStartIndex()当前分页索引 - V) R<
ps.getNextIndex()下一页索引 'w<BJTQIL
ps.getPreviousIndex()上一页索引 jp<VK<s]
iLq#\8t^
lglYJ,
!e8i/!}^S
;b~~s.+
B!,yfTk]
is#8R:7.:
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 D5A=,\uk
0Qd%iP)6
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 ym%slg
Df=q-iq<{/
一下代码重构了。 TQ9'76INb
o" _=K%9
我把原本我的做法也提供出来供大家讨论吧: z]#hWfM4B:
B4W\
t{
首先,为了实现分页查询,我封装了一个Page类: 2"/yEg*=
java代码: 7 ^I:=qc72
ey1Z/|
5{l1A(b
/*Created on 2005-4-14*/ :$H!@n*/R
package org.flyware.util.page; k$[{n'\@
'F_}xMU
/** }=@zj6AC
* @author Joa T0|H9>M
* ,seFkG@1
*/ C ?7X"~~
publicclass Page { HhSjR%6HY;
1bRL"{m^)-
/** imply if the page has previous page */ &4kM8Qh
privateboolean hasPrePage; #ooc)),
f'{>AKi=C
/** imply if the page has next page */ 'h*Zc}Q:
privateboolean hasNextPage; TlPVHJyt
n(&*kfk
/** the number of every page */ 981!2*
privateint everyPage; EF;,Gjh5p
31XU7A
/** the total page number */ olty4kGD$V
privateint totalPage; ROoE%%8I
z+"0>ZN&
/** the number of current page */ DP>mNE
privateint currentPage; c^S&F9/U*
njMLyT($
/** the begin index of the records by the current I'IB_YRL4
4
X`^{~
query */ <-)9>c:k
privateint beginIndex; :kp0EiJ
f5?hnt`m
?)cJZ>$!w
/** The default constructor */ ,L%p
public Page(){ @hT;Bo2G]
Kym:J \}9B
} ryEvmWYu
t<lyg0f
/** construct the page by everyPage 5Rs?CVVb
* @param everyPage r<(kLpOH%
* */ E^syrEz
public Page(int everyPage){ /=M.-MU2
this.everyPage = everyPage; v MWC(m
} s^PmnFR
Y'_ D<Mp
/** The whole constructor */ hEcYpng~
public Page(boolean hasPrePage, boolean hasNextPage, |Ow$n
r5)f82pQ
s5.k|!K
int everyPage, int totalPage, CjZ6NAHc
int currentPage, int beginIndex){ Kq6qXc\x
this.hasPrePage = hasPrePage; yS"0/Rm}
this.hasNextPage = hasNextPage; &ps6s.K
this.everyPage = everyPage; ro]L}oE+
this.totalPage = totalPage; APuu_!ez1
this.currentPage = currentPage; g.&\6^)8p
this.beginIndex = beginIndex; SA3Y:(
} j&}B<f _6J
fiqj;GW
/** ^z?=?%{
* @return R7t
bxC
* Returns the beginIndex. gD40y\9r
*/ PDZ)*$EE
publicint getBeginIndex(){ <Am^z~[
return beginIndex; -AeHY'T
} 1
'%-y
_^3@PM>
/** KqY>4tb
* @param beginIndex |Kn^w4mN
* The beginIndex to set. cFxSDTR
*/ [r~~=b7*[
publicvoid setBeginIndex(int beginIndex){ RA~_]Hk
this.beginIndex = beginIndex; F~P/*FFK
} ;@O(z*14@
%w%zv2d
/** ,,2_/u\"/i
* @return L`bo#,eg6
* Returns the currentPage. ~l4Q~'
*/ 6KBHRt
publicint getCurrentPage(){ .=aMjrME
return currentPage; 3?6 Ber y=
} CCwK8`%
w5=EtKTi
/** *Ag, kW"
* @param currentPage A8`orMo2
* The currentPage to set. BC&^]M
*/ {kv4g\a;
publicvoid setCurrentPage(int currentPage){ E<P*QZ-C3
this.currentPage = currentPage; XAGiu;<,=
} _"`/^L`Q?
P:vX }V |[
/** k.ww-nH
* @return j[BgP\&,
* Returns the everyPage. !-@SS>
*/ 3pzOt&T|w
publicint getEveryPage(){ r6/<&1[
return everyPage; s
UvKA0
} ,7/\&X<`B
4v i B=>
/** ;+!xZOmm
* @param everyPage uFa-QG^Y{
* The everyPage to set. |HT)/UZ|
*/ |c
BHBd
publicvoid setEveryPage(int everyPage){ Zj5NWzj
X
this.everyPage = everyPage; Ez wF`3RjK
} aw;{<?*
ZW`HDrP`
/** LIc*tsl
* @return e1Dj0s?i~K
* Returns the hasNextPage. ]oo|o1H87
*/ I\)N\move
publicboolean getHasNextPage(){ +# A|Zp<
return hasNextPage; jh-kCF
} mRNHq3
"otr+.{`*
/** FkLQBpp(x
* @param hasNextPage d
u_O} x
* The hasNextPage to set. vHoT@E#}'
*/ !k ;[^>
publicvoid setHasNextPage(boolean hasNextPage){ ',<{X(#(
this.hasNextPage = hasNextPage; !G@V<'F
} p` ^:Q*C"
:Fq2x_IUE
/** :^C#-O
* @return DB!uv[c
* Returns the hasPrePage. t4*aVHT
*/ /<Gyg7o0
publicboolean getHasPrePage(){ 4j2~"K
return hasPrePage; B/[hi%~
} ^!XU+e+:0
HE4`9$kVLr
/** qLU15cOM
* @param hasPrePage Ul7,k\q@
* The hasPrePage to set. YeR7*[l
*/ noWRYS %
publicvoid setHasPrePage(boolean hasPrePage){ wK/}E h\^
this.hasPrePage = hasPrePage; 8kKRx
} yKel|vM#
@D( KuF
/** \r)_-
* @return Returns the totalPage. t ;bZc s
* &C!g(fS
*/ EVby 9!
publicint getTotalPage(){ XL%vO#YT
return totalPage; sf=%l10Fk#
} .CB"@.7
f[wjur
/** G=+!d&mbg
* @param totalPage R|d^M&K,
* The totalPage to set. i|::vl
*/ )L&n)w
publicvoid setTotalPage(int totalPage){ y?rK5Yos
this.totalPage = totalPage; /i\uwa,
} 0$Qn#K
xV
}:M
} Wl@0TUK
lUy*549,
IX > j8z[
96^1Ivd
`*.r'k2R
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 w%!k?t,*]
.je~qo)
个PageUtil,负责对Page对象进行构造: 5+#?7J1
java代码: J?UZN^
"1=.5:yG
D~t"9Z\
/*Created on 2005-4-14*/ E#WjoIk
package org.flyware.util.page; }-k_?2"A
98<bF{#0WM
import org.apache.commons.logging.Log; h[M6.
import org.apache.commons.logging.LogFactory; AOq9v~)z-
3:z4M9f
/** U[H+87zg
* @author Joa ~50y-
* BdRE*9.0
*/ _AsHw
publicclass PageUtil { !nqm ;96
8=u+BDG
privatestaticfinal Log logger = LogFactory.getLog Oa3=+_C~$1
H_xQ>~b
(PageUtil.class); ~Iu21Q(*
/I`!iK
/** -hJ>wGI
* Use the origin page to create a new page 9 Le/'o vq
* @param page v\r7.l:hf
* @param totalRecords 8kn]_6:3i
* @return HCn]#
*/ `eA&C4oFOO
publicstatic Page createPage(Page page, int u:qD*zOq
Y ~\`0?ST
totalRecords){
K[3D{=
return createPage(page.getEveryPage(), V"D<)VVA
LgD{!
page.getCurrentPage(), totalRecords); #E~WVTOw
} v;NZ"1=_
bl+@}+A
/** GXAk*vS=G
* the basic page utils not including exception 1zEZ\G
cxF?&0[mY
handler UVQ a
af
* @param everyPage %RK\Hz2q3
* @param currentPage t,r&SrC
* @param totalRecords HK,G8:T
* @return page ]R3pBC"Jv
*/ v1tN
DyM6
publicstatic Page createPage(int everyPage, int 6{,K7FL
}G:uzud10
currentPage, int totalRecords){ S<bz7
k9
everyPage = getEveryPage(everyPage); 1Ag ;s
currentPage = getCurrentPage(currentPage); ")[Q4H;V
int beginIndex = getBeginIndex(everyPage, 8bKWIN g_n
BafzQ'
currentPage); <PuB3PEvV
int totalPage = getTotalPage(everyPage, =-s20mdj
f 7QUZb\
totalRecords); TG%hy"k
boolean hasNextPage = hasNextPage(currentPage, VTgbJ{?
V3hm*{ON
totalPage); :\w[xqH
boolean hasPrePage = hasPrePage(currentPage); 7AFS)_w
P.H/H04+
returnnew Page(hasPrePage, hasNextPage, TF iM[
everyPage, totalPage, &s}@7htE
currentPage, %(7wZ0Z
<:yq~?
beginIndex); 6^z\;,p
} i[BR(D&l_p
9'*ZEl^?D
privatestaticint getEveryPage(int everyPage){ ^xkppN2
return everyPage == 0 ? 10 : everyPage; nAba
=iW
} E+m"yQp{
Pk?%PB?Z
privatestaticint getCurrentPage(int currentPage){ +qW w-8
return currentPage == 0 ? 1 : currentPage;
qzbkxQu]g
} ?GD?J(S
]OCJ~Zw
privatestaticint getBeginIndex(int everyPage, int -L4G WJ~.-
%F]9^C+
currentPage){ n4_:#L?
return(currentPage - 1) * everyPage; 36A.h,~
} oTV8rG
my #u^O;
privatestaticint getTotalPage(int everyPage, int "6o}qeB l
U"Ob@$ROFy
totalRecords){ LkZo/K~
int totalPage = 0; He_(JXTP
';CuJXAj
if(totalRecords % everyPage == 0) [+cnx21{
totalPage = totalRecords / everyPage; j'Q-*-3
else {'Qk>G
s
totalPage = totalRecords / everyPage + 1 ; (l!D=qy
-O>mY)
return totalPage; mP
.&fS
} dK(%u9v
j{w,<Wt>
privatestaticboolean hasPrePage(int currentPage){ z hm!sMlO
return currentPage == 1 ? false : true; MfpWow-#{
} C.e|VzQa
%LZM5Z^
privatestaticboolean hasNextPage(int currentPage, Xgth|C}k
po$ynp756
int totalPage){ 4l!Yop0h
return currentPage == totalPage || totalPage == Y l3[~S
'UG}E@G
0 ? false : true; #vZ]2Ud=2
} r-Xe<|w
l:Xf(TLa
<Ibr.L]
} >@89k^#Vc
8\V>6^3CD$
e]B<