快速学习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> {}
在以上的两种实现方式中,没有哪一个一定会优于另一个,所以我们不一定要全部掌握,掌握一种即可)。个人觉得第一个会难一些,规则太多,难记,这里就不详细阐述了。
上一篇: 4.20日阿里笔试
下一篇: Aop实现操作日志入库管理
推荐阅读
-
【Spring Data 系列学习】Spring Data JPA @Query 注解查询
-
序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
-
【Spring Data 系列学习】Spring Data JPA @Query 注解查询
-
Spring Data JPA 多条件查询
-
【JPA】Spring Data JPA 实现分页和条件查询
-
快速学习Spring Data JPA -- 第六章JPA多条件查询
-
Spring Data JPA Specification一对多,多对一。jpa多表字段查询
-
spring data jpa 多对多查询
-
spring data jpa 多对多查询
-
Spring Boot学习笔记(五)Spring Data Jpa 快速上手(四)多对一@ManyToOne、一对多@OneToMany,以及级联操作