多对多关联查询网上多是Join的方式,缺点就是需要实体间相互引用,不太灵活。
简单示例:A、B两表关联,代码仅为示意,大概是这样的应该可以理解吧?不想花时间多写了。
aDao.findAll((Root<A> aRoot, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {
Root<B> bRoot = cq.from(B.class);
// Root<C> cRoot = cq.from(C.class); 也可以加C表,D表…… 然后再cb中加关联条件就可以了。
// Join<A, B> join = A.join("b"); 可以用join方式联合查询,但是需要A中有B的实体。
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(aRoot.get("id"),bRoot.get("aId"))); // AB两表的关联条件,就是sql join 中的on条件
predicates.add(cb.notEqual(aRoot.get("XXX"), XXX));
cq.distinct(true); // 去重 如果多对多
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
} , pageable);