JPA使用Specification高级查询连接查询的时候条件放在on后面,而不是放在where后面

先看一个条件放在where后面的

    //分页及排序
    pageInfo.setNumber(pageInfo.getNumber() - 1);
    Pageable pageable = new PageRequest(pageInfo.getNumber(), pageInfo.getSize(), Sort.Direction.DESC, "issueDate");
    //查询条件
    Specification specification = (root, cq, cb) -> {
        List preList = new ArrayList<>();
        if (StringUtils.isNotEmpty(date)) {
        	Join join =root.join("expertAppointment", JoinType.LEFT);
        	preList.add(cb.and(cb.like(join.get("date").as(String.class),"%"+date+"%")));
        }
        // distince去重
        cq.distinct(true);
        preList.add(cb.and(cb.equal(root.get("creator").as(String.class), userId)));
        return cb.and(preList.toArray(new Predicate[preList.size()]));
    };
    // 执行查询
    Page pageData = expertRepository.findAll(specification, pageable);

看下这个查询的sql:
JPA使用Specification高级查询连接查询的时候条件放在on后面,而不是放在where后面_第1张图片
可以看到高级查询的条件是在where后面。

把高级查询条件换成这种:

        if (StringUtils.isNotEmpty(date)) {
        	Join join =root.join("expertAppointment", JoinType.LEFT);
        	join.on(cb.and(cb.like(join.get("date").as(String.class),"%"+date+"%")));
        }

JPA使用Specification高级查询连接查询的时候条件放在on后面,而不是放在where后面_第2张图片
这样条件是在on后面,而不是放到where里面了。

你可能感兴趣的:(JPA使用Specification高级查询连接查询的时候条件放在on后面,而不是放在where后面)