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

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

    //分页及排序
    pageInfo.setNumber(pageInfo.getNumber() - 1);
    Pageable pageable = new PageRequest(pageInfo.getNumber(), pageInfo.getSize(), Sort.Direction.DESC, "issueDate");
    //查询条件
    Specification<Expert> specification = (root, cq, cb) -> {
        List<Predicate> preList = new ArrayList<>();
        if (StringUtils.isNotEmpty(date)) {
        	Join<Expert, ExpertType> 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<Expert> pageData = expertRepository.findAll(specification, pageable);

看下这个查询的sql:
sql
可以看到高级查询的条件是在where后面。

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

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

sql2
这样条件是在on后面,而不是放到where里面了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值