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);

}



{context}