JPA - SpringDataJpa动态查询

1. JpaSpecificationExecutor

在继承JpaRepository,和JpaSpecificationExecutor接口后,我们就可以使用接口中定义的方法进行查询,JpaRepository里面定义了基本操作,而JpaSpecificationExecutor则用于复杂查询(分页等查询操作)

2. 动态查询

有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象
在这里插入图片描述

/**
 *	JpaSpecificationExecutor中定义的方法
 **/
 public interface JpaSpecificationExecutor<T> {
   	//根据条件查询一个对象
 	T findOne(Specification<T> spec);	
   	//根据条件查询集合
 	List<T> findAll(Specification<T> spec);
   	//根据条件分页查询
 	Page<T> findAll(Specification<T> spec, Pageable pageable);
   	//排序查询查询
 	List<T> findAll(Specification<T> spec, Sort sort);
   	//统计查询
 	long count(Specification<T> spec);
}

Specification

对于JpaSpecificationExecutor,这个接口基本是围绕着Specification接口来定义的。我们可以简单的理解为,Specification构造的就是查询条件
在这里插入图片描述
Specification接口中只定义了这一个方法

 //构造查询条件
    /**
    *	Root :Root接口,代表查询的根对象,查询的任何属性都可以通过根对象中获取
    *	CriteriaQuery:代表一个顶层查询对象,用来自定义查询
    *	CriteriaBuilder :用来构建查询,此对象里有很多条件方法
    **/
    public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);

2.1 使用Specifications完成条件查询

//依赖注入customerDao
@Autowired
private CustomerDao customerDao;	
@Test
public void testSpecifications() {
    //使用匿名内部类的方式,创建一个Specification的实现类,并实现toPredicate方法
	Specification <Customer> spec = new Specification<Customer>() {
		public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
		//cb:构建查询,添加查询方式   like:模糊匹配
		//root:从实体Customer对象中按照custName属性进行查询
		Path<Object> custName = root.get("custName"); 
        return cb.equal(custName,"minifull");
		}
	};
	Customer customer = customerDao.findOne(spec);
	System.out.println(customer);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值