JPA多表关联查询
@Override
public Page<ArticleInfo> findAllBySpecification(final ArticleInfo info, int page) {
Pageable pageable = PageRequest.of(page, Constants.PAGE_SIZE_10);
Specification specification = new Specification<ArticleInfo>() {
@Override
public Predicate toPredicate(Root<ArticleInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb){
List<Predicate> list = new ArrayList<Predicate>();
if(info.getCreateUid() != null && info.getCreateUid() > 0){
list.add(cb.equal(root.get("createUid"), info.getCreateUid()));
}
if(info.getId() != null && info.getId() > 0){
list.add(cb.equal(root.get("id"), info.getId()));
}
if(info.getStatusCd() != null){
list.add(cb.equal(root.get("statusCd"), info.getStatusCd()));
}
if(info.getContext() != null && !"".equals(info.getContext())){
list.add(cb.like((Expression) root.get("context"), "%" +info.getContext()+ "%"));
}
if(info.getContextType() != null && !"".equals(info.getContextType())){
list.add(cb.equal(root.get("contextType"), info.getContextType()));
}
if(info.getTitle() != null && !"".equals(info.getTitle())){
list.add(cb.like((Expression) root.get("title"), "%" +info.getTitle()+ "%"));
}
if(info.getShortContext() != null && !"".equals(info.getShortContext())){
list.add(cb.like((Expression) root.get("shortContext"), "%" +info.getShortContext()+ "%"));
}
if(info.getLabelId() != null && !"".equals(info.getLabelId())) {
//labelInfoList为ArticleInfo中的@ManyToMany字段
Join<ArticleInfo, LabelInfo> join = root.join("labelInfoList", JoinType.LEFT);
//id为LabelInfo中的字段
list.add(cb.equal(join.get("id"), info.getLabelId()));
}
query.where(list.toArray(new Predicate[list.size()]));
query.orderBy(cb.desc(root.get("id")));
return query.getRestriction();
}
};
return articleRepository.findAll(specification, pageable);
}