欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-25 19:31:22
...

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