Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 %(i(Cf8@
tL}_kK_!
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 9ELRn@5.
.V.ga2+
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 M\6u4p!G!
-EIfuh
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 a1 .+L
XI7:y4M
。 N)Qz:o0W
EB2 5N~7
分页支持类: v/z~ j
CA5q(ID_
java代码: -I*NS6
% h"%G=:
Y2>0Y3yM
package com.javaeye.common.util; .XPPd?R
c(r8
F[4w
import java.util.List; eiwPp9[08
Eq6.
s)10
publicclass PaginationSupport { <= Aqi9 1
f\h|Z*Bv
publicfinalstaticint PAGESIZE = 30; = @n `5g
1,Ji|&Pwf
privateint pageSize = PAGESIZE; .j^=]3
m 7/b.B}
privateList items; ^;mnP=`l[
mt*/%>@7R
privateint totalCount; G[ gfD\
w
.+B h
privateint[] indexes = newint[0]; |jJ9dTD8/
?
H7?>ZE
privateint startIndex = 0; WN3]xw3
#xfPobQ>il
public PaginationSupport(List items, int &l
_NCo2
dA=T+u
totalCount){ t:yJ~En]=
setPageSize(PAGESIZE); tq&CJvJ4
setTotalCount(totalCount); A_}6J,*u
setItems(items); 0S$6j-"
setStartIndex(0); {<L|Z=&k`
} '/
*;g#W=
x}X
hL
public PaginationSupport(List items, int $Eh:m&hq
PpWdZ
totalCount, int startIndex){ [28Vf"#]
setPageSize(PAGESIZE); i f !
setTotalCount(totalCount); ],xvhfZ"dn
setItems(items); 53O}`xX!6
setStartIndex(startIndex); hhcO
]*
} =}m'qy
Ah Rvyj
public PaginationSupport(List items, int >@?`n}r|
B'!I{LC
totalCount, int pageSize, int startIndex){ gib'f@i ;
setPageSize(pageSize); S/)yi
setTotalCount(totalCount); 35Cm>X
setItems(items); Bl/Z _@
setStartIndex(startIndex); #bmbK{ [
} ( Qj;B)
4d;.p1ro
publicList getItems(){ $
nHf0.V1
return items; h}yfL@
} Y:4/06I
Cm~z0c|T
publicvoid setItems(List items){ 4'G osQ85
this.items = items; W'L
} I/Q~rVt
xa$4P [
publicint getPageSize(){ B)=)@h[f
return pageSize; + 3c (CTz
} RR[1mM
+~za6
publicvoid setPageSize(int pageSize){ bo40s9"-*W
this.pageSize = pageSize; %1z`/B
} _l{_n2D-
U_<k*o@:
publicint getTotalCount(){ ?C* }NM
return totalCount; wjfc9z
} VX]Ud\(
-E>LB\[t)
publicvoid setTotalCount(int totalCount){ `tH:oP0=
if(totalCount > 0){ A!IZIT5)m
this.totalCount = totalCount; E5
uk<e_
int count = totalCount / z\c$$+t
VJOB+CKE
pageSize; Y20T$5{#
if(totalCount % pageSize > 0) ]qO*(m:}o
count++; lnv&fu`1P
indexes = newint[count]; x yyEaB
for(int i = 0; i < count; i++){ UKzXz0
indexes = pageSize * R7 ^f|/l
qX:YI3:,@
i; ]oizBa@?G
} 3B?7h/f
}else{ P`OZoI$bV
this.totalCount = 0; K?eY<L
} JGQ)/(
}
,)Z1&J?
*Z2#U?_
publicint[] getIndexes(){ +XpQ9Cd
return indexes; !MEA@^$#
} cg_j.=M-
m
e2$ R>@
publicvoid setIndexes(int[] indexes){ CMC9%uq
this.indexes = indexes; Yk=2ld;;
} .RN2os{
L&G5 kY`
publicint getStartIndex(){ &{ZTtK&JF
return startIndex; sjG@4Or
} L^e%oQ>s
k@^T<Ci
publicvoid setStartIndex(int startIndex){ Oz-@e%8L
if(totalCount <= 0) j71RlS73
this.startIndex = 0; gIY]hC.
elseif(startIndex >= totalCount) 8DcIM(;Z
this.startIndex = indexes _`+2e-
5~{s-Ms
[indexes.length - 1]; *_/n$&
I%&
elseif(startIndex < 0) F~wqt7*
this.startIndex = 0; 36\_Y?zx%
else{ z@U5
this.startIndex = indexes UNyk,
#4
8]&\FA 8
[startIndex / pageSize]; _ pO1XM
} CSlPrx2\
} |Pq z0n=v
]:svR@E
publicint getNextIndex(){ O7z5,-
int nextIndex = getStartIndex() + z,c=."<z
H -t" Z}
pageSize; FZx.Yuv
if(nextIndex >= totalCount) q" @%W K
return getStartIndex(); SY$%)(c8kL
else %OJq( }
return nextIndex; MQq!<?/
} 2 sK\.yS
^c?$$Tq
publicint getPreviousIndex(){ DsH#?h<-o
int previousIndex = getStartIndex() - CtE <9?
C^7M>i
pageSize; csj4?]gI
if(previousIndex < 0) >;+q,U}
return0; ]
D+'Ao^'
else `ZGKM>q`
return previousIndex; T[%@B"
} `c? 8i
5Yr$tl\k
} bFsJqA.A
Lrq e:\
RKb (
8SoTABHV
抽象业务类 q+W*?a)
java代码: U(5 Yg
Qq3UC%Z1
I\@`AU
/** {QVs[
J1
* Created on 2005-7-12 S3ZIC\2
*/ ASUleOI79(
package com.javaeye.common.business; EM!9_8 f
ZiC~8p_f
import java.io.Serializable; 2<tU
import java.util.List; cBQ+`DXn5c
'1rO&F
import org.hibernate.Criteria; u1ahAk7
import org.hibernate.HibernateException; m.ejGm?
import org.hibernate.Session; =DwY-Ex
import org.hibernate.criterion.DetachedCriteria; }Apn.DYbbf
import org.hibernate.criterion.Projections; F.-:4m(Z
import r=S,/N(1
0,j!*
org.springframework.orm.hibernate3.HibernateCallback; }NKnV3G/Z
import S^A+Km3VB
DeTLh($\
org.springframework.orm.hibernate3.support.HibernateDaoS (W5JVk_o
{9-n3j}
upport; *{dMo,.eI
qkBCI,X_Y
import com.javaeye.common.util.PaginationSupport; GuKiNYI_
` NCH^)
public abstract class AbstractManager extends -ju}I
U3BhoD#f\
HibernateDaoSupport { @.} @K
m.Ki4NUm
privateboolean cacheQueries = false; t^"8
v3'h
Z ty9O8g
privateString queryCacheRegion; 23/;W|
naVbcY
publicvoid setCacheQueries(boolean HM &"2c
3|=L1Pw#
cacheQueries){ /&W~:F
this.cacheQueries = cacheQueries; |"YE_aYu
} \{;3'<
Q-Oj%w4e
publicvoid setQueryCacheRegion(String yZc#@R[0
z
m+3aF
queryCacheRegion){ a V#phP
this.queryCacheRegion = _
qU-@Y$
<KFl4A~
queryCacheRegion; 2*a5pFkb
} i9D<jkc
, FR/X/8
publicvoid save(finalObject entity){ Kiq[PK
getHibernateTemplate().save(entity); cFr`9A\-n
} _kdt0Vr,L
F
h+g@ u6
publicvoid persist(finalObject entity){ ]nq/yAF%
getHibernateTemplate().save(entity); :ka^ztXG
} Nf%/)Tk
{_UOS8j7
publicvoid update(finalObject entity){ e*M-y C
getHibernateTemplate().update(entity); ,O_iSohS
} aUq2$lw1
Dq+S'x~>
publicvoid delete(finalObject entity){ Rw)=<XV)6
getHibernateTemplate().delete(entity); ( e4#9
} Y|E rVf4
QypUBf
publicObject load(finalClass entity, #'BPW<Ob
8wMwS6s:
finalSerializable id){ <YvW /x
return getHibernateTemplate().load BT"n;L?[
wY3|5kbDj
(entity, id); eu'S~c-l
} h}Lrp r2r
GK1oS
publicObject get(finalClass entity, 395`Wkv
1v 4M*
finalSerializable id){ f/t`B^}@
return getHibernateTemplate().get )j. .)o
pd-I^Q3-
(entity, id); c^stfFE&
} ydMSL25<+
K9ek
publicList findAll(finalClass entity){ @a,}k<@E
return getHibernateTemplate().find("from 1NkJs&
dUv(Pu(.#
" + entity.getName()); o8~<t]Ejw
} $E}N`B7
\LM.>vJ
publicList findByNamedQuery(finalString >L433qR
A45!hhf
namedQuery){ k|^`0~E
return getHibernateTemplate 5]K2to)>`
0<+eN8od.
().findByNamedQuery(namedQuery); G\K!7k`)!
} Nka 3H7`
XrI$@e*
publicList findByNamedQuery(finalString query, ~~q>]4>
38GZ_z}r
finalObject parameter){ WZ=$c]gG
return getHibernateTemplate ._q<~_~R
0cq<!{d
().findByNamedQuery(query, parameter); &r2\P6J
} ZE9.r`
yB|1?L#
publicList findByNamedQuery(finalString query, 85lcd4&~
"[0.a\ d<
finalObject[] parameters){ C8D`:k
return getHibernateTemplate SGu`vN]
Z>pZ|
().findByNamedQuery(query, parameters); iXL?ic
} xNjWo*y v
?C']R(fQ\
publicList find(finalString query){ /@U bN\
return getHibernateTemplate().find |,tKw4
}s[`T
(query); vRH2[{KQ9
} qB3E
*MQ`&;Qa,
publicList find(finalString query, finalObject `1uGU[{x
] !n3j=*
parameter){ Pbt7T
Q
return getHibernateTemplate().find IyAD>Q^
A9MTAm{
(query, parameter); :*s@L2D6
} D 9UM8Hxi
U$;UW3-
public PaginationSupport findPageByCriteria -b|"%e<'
R2JPLvs
(final DetachedCriteria detachedCriteria){ O=6[/oc
'
return findPageByCriteria "28zLo3
w~yC^`
(detachedCriteria, PaginationSupport.PAGESIZE, 0); 3,n" d-
} k n/xt
f~7V< v
public PaginationSupport findPageByCriteria k8r1)B4ab
wNU;gz
(final DetachedCriteria detachedCriteria, finalint ]r'D
M3r;Pdj2r
startIndex){ VOIni<9y
return findPageByCriteria e^;%w#tEqI
P3nBxw"
(detachedCriteria, PaginationSupport.PAGESIZE, r AE5.Q!u
TFAR>8Nm
startIndex); VfozqUf
} Wb[k2V
}Rw6+;
public PaginationSupport findPageByCriteria wD4[UU?
2$v8{Y&
(final DetachedCriteria detachedCriteria, finalint
EWr7eH
0T^0)c
pageSize, )?pnV":2Y
finalint startIndex){ q@tym5
return(PaginationSupport) _07$TC1
=3!o_
getHibernateTemplate().execute(new HibernateCallback(){ p$uPj*
publicObject doInHibernate |(AFU3~
7iyx_gyo
(Session session)throws HibernateException { VJ?>o
Criteria criteria = +bT[lJ2O>G
X?XB!D7[
detachedCriteria.getExecutableCriteria(session); Cc;8+Z=a?G
int totalCount = X yiaRW
E^Q
J50
((Integer) criteria.setProjection(Projections.rowCount q^?a|l
tzv4uD]
()).uniqueResult()).intValue(); _GrifGU\
criteria.setProjection :wG
)
kdp^{zW}
(null); sG)aw`_j
List items = jOzi89
^bP`Iv
criteria.setFirstResult(startIndex).setMaxResults zWH)\>X59
x,zYNNx5g
(pageSize).list(); @b,6W
wc
PaginationSupport ps = lQBEq"7$
7?{y&sf
new PaginationSupport(items, totalCount, pageSize, @$'pMg
J_;*@mW
startIndex); MTKNIv|
return ps; k>7bPR5Mw
} n1PBpM9!
}, true); k61mRO
} ZhoV,/\+
7mf&`.C
np
public List findAllByCriteria(final xVgm 9s$"c
Y}:4y$<
DetachedCriteria detachedCriteria){ P+=m.
return(List) getHibernateTemplate A^#\=ZBg1
h(<>s#=E
().execute(new HibernateCallback(){ {+nf&5E 6
publicObject doInHibernate '5LdiSk
U| VL+9#hd
(Session session)throws HibernateException { JgA{1@h
Criteria criteria = R PoBF~>
j>B* 8*Ss
detachedCriteria.getExecutableCriteria(session); d4*SfzB
return criteria.list(); ' QMcQvU
} u&^KrOM@#
}, true); '&dT
} "j8)l4}
,B_c
public int getCountByCriteria(final N-_APWA
K&Bbjb_|
DetachedCriteria detachedCriteria){ Em^~OM3U$q
Integer count = (Integer) M=lU`Sm
.a7RGT3]m
getHibernateTemplate().execute(new HibernateCallback(){ C=]<R<Xy
publicObject doInHibernate MkL2I+*
_U-`/r o
(Session session)throws HibernateException { 9}m?E<6&
Criteria criteria = GBT|1c'i
!|UX4
detachedCriteria.getExecutableCriteria(session); X^K^az&L
return /t`\b
[
cz{`'VN}`
criteria.setProjection(Projections.rowCount {\CWoFht>
0c`nk\vUy
()).uniqueResult(); c)B3g.C4m
} 6h2keyod
}, true); V7r_Ubg@K
return count.intValue(); JJ%@m;~
} CbC[aVA=
} /e|Lw4$@S
u!5q)>Wt(
`[g$EXX
ES AX}uF
2xf lRks
ybw\^t
用户在web层构造查询条件detachedCriteria,和可选的 $
P5K
Pd\4hy
startIndex,调用业务bean的相应findByCriteria方法,返回一个 Fa[^D~$l*
)Uy%iE*
PaginationSupport的实例ps。 !Q15qvRS
*DC/O(
0
ps.getItems()得到已分页好的结果集 ]& ckq
ps.getIndexes()得到分页索引的数组 f?
@Qt<+k
ps.getTotalCount()得到总结果数 z<%bNnSO
ps.getStartIndex()当前分页索引 s_XCKhN:
ps.getNextIndex()下一页索引 ZY]$MZf5yo
ps.getPreviousIndex()上一页索引 ^4+NPk
kN
Ll|in@
6QCVi
1W{ oj
J8p; 1-C"
n]`]gLF\i
#IvKI+"
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 GdI,&|/
ye9GBAj
/
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 2[ofz}k]r)
gBv!E9~l
一下代码重构了。 [,,@>nyD
$"W[e"Q
我把原本我的做法也提供出来供大家讨论吧: {$hWz (
N6"sXwm
首先,为了实现分页查询,我封装了一个Page类: zGR,}v%%
java代码: -dA9x~o
R/Bjc}J'
$cHU,
/*Created on 2005-4-14*/ kY\faWuR
package org.flyware.util.page; Nh }-6|M
))f@9m
/** z+7V}aPM
* @author Joa pxgf%P<7
* R}gdN-941
*/ \efDY[j/
publicclass Page { L%/>Le}VX
W+1nf:AI.
/** imply if the page has previous page */ PL{lYexJ
privateboolean hasPrePage; ?D _4KFr
* @]wT'
/** imply if the page has next page */ <efO+X!
privateboolean hasNextPage; JAd .\2%Y
(WC
=om
/** the number of every page */ [mu8V+8@d4
privateint everyPage; #$xtUCqX
slPr^)
/** the total page number */ Gg9s.]W
privateint totalPage; 7HH@7vpJ^
E> GmFw
/** the number of current page */ <b,WxR`
privateint currentPage; )/@KdEA:
fc@<' -VA
/** the begin index of the records by the current XjN=UhC
klnNBo!
query */ nt$PA(Y
privateint beginIndex; En9J7es_
X-((
[A
81x/bx@L%
/** The default constructor */ >^Wpc
public Page(){ p-{ 4 $W
d9:I.SA)E
} dY&v(~&;]
#~nXAs]Q
/** construct the page by everyPage #1E4
R}B
* @param everyPage yKl^-%Uq<
* */ ;&=CZ6vH
public Page(int everyPage){ }.)R#hG?
this.everyPage = everyPage; >8I~i:hn
} 3]?='Qq.(
^6kl4:{idE
/** The whole constructor */ <M1*gz
public Page(boolean hasPrePage, boolean hasNextPage, _lk VT']
g 4=1['wW
t;VMtIW+E
int everyPage, int totalPage, c=\ _[G(
int currentPage, int beginIndex){ wi7Br&bGi
this.hasPrePage = hasPrePage; iXo;e
this.hasNextPage = hasNextPage; VQH48{X
this.everyPage = everyPage; [k\VUg:P
this.totalPage = totalPage; sx=1pnP9`
this.currentPage = currentPage; X5/j8=G H`
this.beginIndex = beginIndex; 'uL$j=vB
} yg'CL/P
W`9{RZ'
/** #oTVfY#
* @return g]L8Jli
* Returns the beginIndex. }C_g;7*
*/ f\cTd/?Ju
publicint getBeginIndex(){ kR
%,:
return beginIndex; jy.L/s
} 'XKfKv >;
A"M;kzAfHM
/** z_xy*Iif
* @param beginIndex ?
bWc<]
* The beginIndex to set. ASoBa&vX
*/ p1niS:}j
publicvoid setBeginIndex(int beginIndex){ e_ epuki
this.beginIndex = beginIndex; ZrEou}z(*
} 153*b^iDBh
18%$Z$K,
/** seK;TQ3/7
* @return VdM Ksx`r
* Returns the currentPage. @4*eH\3
*/ vzI>:Bf
publicint getCurrentPage(){ i=n;rT
return currentPage; liPrxuP`
} L@[}sMdq(
V)~b+D
/** Z1q<) O1QX
* @param currentPage !%t@wQ]\hG
* The currentPage to set. `;}qjm0a
*/ nw/g[/<;
publicvoid setCurrentPage(int currentPage){ Zc_F"KJL
this.currentPage = currentPage; 6/wC StZ
} oe^JDb#
<`SA>P
/** 83V\O_7j
* @return n-M6~
* Returns the everyPage. xM<aQf\j
*/ OCdX'HN5Y
publicint getEveryPage(){ ;U?=YSHk7
return everyPage; W#g!Usf:/
} I_8 n>\u
}o!b3*#
/** WP\kg\o
* @param everyPage j7g>r/1eE
* The everyPage to set. ^^ix4[1$Z
*/ J#wf`VR%
publicvoid setEveryPage(int everyPage){ bz nMD
this.everyPage = everyPage; \Kui`X
} ck
`td%
YR\(*LJL
/** [AFR \{
* @return Xmmj.ZUr
* Returns the hasNextPage. x4kQG e(
*/ ]lGkZyUhI
publicboolean getHasNextPage(){ zwQ#Yvd
return hasNextPage; U+B{\38
} ] rqx><!
~P}ng{x4z
/** cy6YajOk7
* @param hasNextPage 9
AD*
* The hasNextPage to set. Da[#X`Kp$
*/ Y]6dYq{k
publicvoid setHasNextPage(boolean hasNextPage){ cCiDe`T\F
this.hasNextPage = hasNextPage; t3.;qDy
} \25EI]
mnZfk
/** VgbT/v
* @return GBS+ 4xL|
* Returns the hasPrePage. 7R5ebMW
V
*/ GJU(1%-
publicboolean getHasPrePage(){ imM#zy
return hasPrePage; t
4M-;y
} a6:hH@,
T-4dD
/** 3jfAv@I ~
* @param hasPrePage wU'+4N".
* The hasPrePage to set. J=kf KQV
*/ fA1{-JzV<4
publicvoid setHasPrePage(boolean hasPrePage){ VPO~veQ
this.hasPrePage = hasPrePage; PQ_A^ 95
} AwuhFPG
w#BT/6W&G
/** ODRy
* @return Returns the totalPage. 2H8\P+
* -0`n(`2
*/ er
BerbEEH
publicint getTotalPage(){ Yevd h<
return totalPage; 8.wtv5eZ
} 4!ZT_q
>@G"*le*)
/** y~OP9Tg
* @param totalPage mIrN~)C4\
* The totalPage to set. FnOahLS
*/ >U\P^yU
publicvoid setTotalPage(int totalPage){ 1\lZ&KX$i
this.totalPage = totalPage; <ir]bQT
} By[M|4a
5(1c?biP&
} :>ca).cjac
b O}&i3.L;
`DGI|3
/i_FA]Go
qM3NQ8Rm
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 b$
8R
9RSviIi$
个PageUtil,负责对Page对象进行构造: EcytNYn
java代码: I%Z=O=
b!J?>du
i&\ >/ 1
/*Created on 2005-4-14*/ inq
{" 6
package org.flyware.util.page; eq"Xwq*
q TWQ!
import org.apache.commons.logging.Log; Ur1kb{i
import org.apache.commons.logging.LogFactory; }{PG^ Fc<P
icVB?M,m
/** >bmdu\j5R
* @author Joa b,jo94.G
* Hd-g|'^K
*/ 805oV(-
publicclass PageUtil { 4kV$JV.l
(t@!0_5
privatestaticfinal Log logger = LogFactory.getLog N?,
BVus3Y5IJQ
(PageUtil.class); BSr#;;\
c1R[Hck
/** H<nA*Zf2@R
* Use the origin page to create a new page XN\rq=
* @param page 23houS
* @param totalRecords ei}(jlQp
* @return qJtLJ<=1
*/ {{pN7Z
publicstatic Page createPage(Page page, int y=
8SD7P'
`d/* sX?k
totalRecords){ (6}7z+
return createPage(page.getEveryPage(), :1"k`AG
e:N;Jx#
page.getCurrentPage(), totalRecords); |RXXj [z
} b>#dMRK
;/ |tU
o$
/** psiuoYf
* the basic page utils not including exception heWQPM|s
Ix(,gDN
handler Ne3YhCC>
* @param everyPage tK# /S+l
* @param currentPage '4M; ;sKW
* @param totalRecords WD kE
5
* @return page y5^OD63s
*/ &b%2Jx[+
publicstatic Page createPage(int everyPage, int #tw_`yh
bl10kI:F
currentPage, int totalRecords){ ?y"M>#
everyPage = getEveryPage(everyPage); `q | )_
currentPage = getCurrentPage(currentPage); hc9ON&L\>
int beginIndex = getBeginIndex(everyPage, jWvi%Iqi
O^ &m
currentPage); N<Ym&$xR
int totalPage = getTotalPage(everyPage, L0{[L
) 3f\H
totalRecords); q^ &r<i
boolean hasNextPage = hasNextPage(currentPage, z/WGL
X -=M>H^
totalPage); u35"oLV6}#
boolean hasPrePage = hasPrePage(currentPage); oxI?7dy5
]vV)$xMX
returnnew Page(hasPrePage, hasNextPage, Q$k#q<+0
everyPage, totalPage, GZuWAa
currentPage, BT$Oh4y4
3U!=R-
beginIndex); |S<!'rY
} gg#lI|
~oK0k_{~
privatestaticint getEveryPage(int everyPage){ g2M1zRm;
return everyPage == 0 ? 10 : everyPage; \W=Z`w3
} ^;[_CF_
$Tt.r
privatestaticint getCurrentPage(int currentPage){ @W==)S%O
return currentPage == 0 ? 1 : currentPage; :>H{?
} ug"4P.wI
)7#3n(_np
privatestaticint getBeginIndex(int everyPage, int N
K@6U_/W
TnKOr~ @*
currentPage){ hOFvM&$
return(currentPage - 1) * everyPage; >r}?v3QW
} .*W7Z8!e
>@-.rkd(
privatestaticint getTotalPage(int everyPage, int
J!3;\
hl)jE
06
totalRecords){ t56PzT'M
int totalPage = 0; \O,yWyU4
2#/sIu-L
if(totalRecords % everyPage == 0) X(8LhsP
totalPage = totalRecords / everyPage; iO18FfM_
else -r~9'aEs
totalPage = totalRecords / everyPage + 1 ; Lm1JiPs d
eIf-7S]m
return totalPage; ,[dvs&-*
} [a~@6*=
3Q7PY46
privatestaticboolean hasPrePage(int currentPage){ 7Xh @%[
return currentPage == 1 ? false : true; )"2eN3H/
} ,4-],~T
x'6i9]+r
privatestaticboolean hasNextPage(int currentPage, 9JILK9mVO
8|L 5nQ
int totalPage){ &
\"cV0
return currentPage == totalPage || totalPage == WYcZD_
(hKjr1s
0 ? false : true; jzWgyI1b
} #~qzaETv,
\TDn q!)?
Zz'g&ew