jpa 动态分页查询示范
jpa 动态分页查询示例
动态拼接查询条件
private
Specification<InfoPushBasic> getWhereClause(
final
InfoPushSearch infoPushBasicSearch){
return
new
Specification<InfoPushBasic>() {
@Override
public
Predicate toPredicate(Root<InfoPushBasic> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
root = query.from(InfoPushBasic.
class
);
List<Predicate> predicate =
new
ArrayList<>();
String infoType = infoPushBasicSearch.getInfoType();
String pushWay = infoPushBasicSearch.getPushWay();
predicate.add(cb.equal(root.get(
"createrId"
), infoPushBasicSearch.getUserId()));
if
(infoType!=
null
){
In<Object> in = cb.in(root.get(
"infoTypeCode"
));
String[] infoTypeArray = infoType.split(
","
);
for
(Serializable infoTypeCode : infoTypeArray) {
in.value(infoTypeCode);
}
predicate.add(in);
}
if
(pushWay!=
null
){
Join<InfoPushBasic,PushWayBasic> pushWayJoin = root.join(root.getModel().getSingularAttribute(
"pushWayBasic"
,PushWayBasic.
class
),JoinType.LEFT);
String[] pushWayArray = pushWay.split(
","
);
Predicate orPre = cb.equal(root.get(
"createrId"
),
"createrId"
);
for
(String pushWayCode : pushWayArray) {
orPre = cb.or(orPre, cb.like(pushWayJoin.get(
"pushWayCode"
).as(String.
class
),
"%"
+ pushWayCode +
"%"
));
}
predicate.add(orPre);
}
if
(infoPushBasicSearch.getChannelState()!=
null
){
predicate.add(cb.equal(root.get(
"channelState"
).as(String.
class
), infoPushBasicSearch.getChannelState()));
}
if
(infoPushBasicSearch.getPushPeriodBegin()!=
null
){
predicate.add(cb.greaterThanOrEqualTo(root.get(
"pushPeriodBegin"
).as(Date.
class
), infoPushBasicSearch.getPushPeriodBegin()));
}
if
(infoPushBasicSearch.getPushPeriodEnd()!=
null
){
predicate.add(cb.lessThanOrEqualTo(root.get(
"pushPeriodEnd"
).as(Date.
class
), infoPushBasicSearch.getPushPeriodEnd()));
}
Predicate[] pre =
new
Predicate[predicate.size()];
return
query.where(predicate.toArray(pre)).getRestriction();
}
};
}