快速学习Spring Data JPA -- 第六章JPA多条件查询

xl_echo编辑整理,交流学习请加1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!


在Springle Data JPA中,我们看到了JPA由于不需要写SQL给我们简化了很多的工作。同时JPA的特性,让我们对数据层面的操作更加简化,更加的方便。但是同时他也给我们带来了不灵便和部分性能问题。那么从我们之前的文章中可以看到,JPA提供了相对灵活的方式,他可以支持原生SQL,所以部分的解决了这个问题。但是真实开发中我们设计的业务可能会更加复杂,仅仅使用原生的SQL已经不能满足需求,比如多条件查询中,某个条件为空,可能导致结果出错或者查询到全部的数据。那么针对这类问题,JPA有自己的解决方法。多条件自定义查询。

先来看一段条件查询代码示例:


/**
 * author:XLecho
 * Date:2018/10/25 0025
 * Time:19:12
 */
@RestController
@RequestMapping(path = "/demo")
public class UserController {

    @Autowired
    private UserRepositoryExtendsJpaSpecificationExecutor userRepositoryExtendsJpaSpecificationExecutor;

    private EntityManager em;

    @RequestMapping(value = "/criteria/query", method = RequestMethod.GET)
    public void getCriteria(){
        //创造一些假的查询数据
        User user = new User();
        user.setId(1L);
        user.setName("A");
        user.setEmail("aaa");

        List<User> all = userRepositoryExtendsJpaSpecificationExecutor.findAll(new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> list = new ArrayList<Predicate>();
                if (user.getEmail() != null && user.getEmail().length() != 0){
                    list.add(criteriaBuilder.equal(root.get("email").as(String.class), user.getEmail()));
                }

                if(user.getId() != null && user.getId() != 0){
                    list.add(criteriaBuilder.equal(root.get("id").as(Integer.class), user.getId()));
                }

                Predicate[] p = new Predicate[list.size()];
                return criteriaBuilder.and(list.toArray(p));
            }
        });
        System.out.println(all);
    }

}

从代码中我们可以明显的看到,我们设置了两个条件,一个是user的email,一个是user的id。虽然我们传入了name,但是我们没有加入进条件。这也是多条件灵活的一个表现。这里我们可以加入某些条件,而某些条件不加入。

注意:JPA多条件查询的实现方式有很多种。比如:
QueryByExampleExecutor
JpaSpecificationExecutor

本章用的就是JpaSpecifiication,需要使用直接在Repository上继承即可。

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

在以上的两种实现方式中,没有哪一个一定会优于另一个,所以我们不一定要全部掌握,掌握一种即可)。个人觉得第一个会难一些,规则太多,难记,这里就不详细阐述了。

本项目地址:https://git.coding.net/xlecho/SpringDataJpa.git

猜你喜欢

转载自blog.csdn.net/xlecho/article/details/83507441