springboot jpa之复杂查询语句(会一种即可)

注意,jpa的复杂查询有很多种方式,原则上能实现自己的要求即可,无需全部掌握,故这里就介绍一种,只要你知道继承JpaRepository意味着什么,我相信你是看得懂的!

不要害怕未知,否则一辈子都跨不过去!

1、总体上来说,对于自己编写复杂查询语句的,先是在UserRepository(持久层)继承JpaSpecificationExecutor(这个T就是你要操作的实体);

public interface UserRepository extends JpaRepository<User, Long> ,
            JpaSpecificationExecutor<User>{
}

2、然后在你自己的业务层(也就是我们经常说的service层,或者service层的实现类),再编写你具体的复杂查询语句(这里SQL的作用就是如果name不空,就模糊查询name,如果deptId不空,就精确查找deptId,至于其他的查询方式,像关联其他表的等等,请自行网上查找,有很多例子的,认真的对比的看,最终会看懂的!)

//Pageable 是分页信息,下面有介绍
private Page queryUserListByUserAndPageable(Pageable pageable, User user) {
        Page result = userRepository.findAll(new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List predicateList = new ArrayList<>();

                if (user.getName() != null && !"".equals(user.getName())) {
                    predicateList.add(
                           //like:模糊匹配,跟SQL是一样的
                            criteriaBuilder.like(
                                    //user表里面有个String类型的name
                                    root.get("name").as(String.class),
                                    //映射规则
                                    "%" + user.getName() + "%"));
                }
                if (user.getDeptId() != null && user.getDeptId() > 0) {
                    predicateList.add(
                            criteriaBuilder.equal(
                                    root.get("deptId").as(Long.class),
                                    user.getDeptId()));
                }
                //如果还有参数就在这里添加if判断条件即可

                Predicate[] predicates = new Predicate[predicateList.size()];
                return criteriaBuilder.and(predicateList.toArray(predicates));
            }
        }, pageable);
        return result;
    }

3、Pageable的编写可以参考这里

结束

你可能感兴趣的:(数据库,字段,SpringBoot,SQL,JPA,springboot学习之路)