目录
SpringData_JpaSpecificationExecutor接口
SpringData_JpaRepository接口
接口更改:
public interface PersonRepository extends JpaRepository<Person, Integer>{
}
测试:
//JpaRepository
@Test
public void testJpaRepository(){
Person person = new Person();
person.setBrith(new Date());
person.setEmail("[email protected]");
person.setLastName("AA");
person.setId(28);
Person person2 = personRepository.saveAndFlush(person);
System.out.println(person == person2);
}
结果:
先执行select ,在执行update
SpringData_JpaSpecificationExecutor接口
接口:
public interface PersonRepository extends JpaRepository<Person, Integer> ,JpaSpecificationExecutor<Person> {
}
通用的带查询条件的分页,JpaSpecificationExecutor接口 可以实现。它不属于Repository 体系,实现一组Jpa Criteria查询相关方法
Specification 实际上是封装了查询条件,是Jpa Criteria 相关的查询条件
测试:
①、目标:实现带查询条件的分页 查询条件id>5
②、 调用JpaSpecificationExecutor 的Page<T> findAll(Specification<T> spec , Pageable pageable);
③、Specification :封装了JPA Criteria 查询的查询条件
④、 Pageable : 封装了请求分页的信息:例如 pageNo,pageSize , Sort
@Test
public void JpaSpecificationExecutor(){
//pageNo 从0开始
int pageNo = 3 -1 ;
int pageSize = 5;
PageRequest pageable = new PageRequest(pageNo, pageSize);
//通常使用它 的匿名内部类
Specification<Person> specification = new Specification<Person>() {
/**
*
* @param *root : 代表查询的实体类
* @param query:可以从中得到root对象,即告知 JPA Criteria 查询要查询哪一个实体类,
* 还可以来添加查询条件,还可以结合EntityManager 对象割刀最终查询的TypeQuery对象
* @param *cb:CriteriaBuilder 对象,用于创建Criteria 相关对象的工厂,
* 当然可以从中获取到Predicate 对象
* @return *Predicate 类型 ,代表一个查询条件
*/
@Override
public Predicate toPredicate(Root<Person> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
Path path = root.get("id");
Predicate predicate = cb.gt(path,5);
return predicate;
}
};
Page<Person> page = personRepository.findAll(specification,pageable);
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("总页数 :" + page.getTotalPages());
System.out.println("当前页面的List :"+page.getContent());
System.out.println("当前第几页:" +(page.getNumber() +1 ));
ystem.out.println("当前页面的记录数:" + page.getNumberOfElements());
}
结果:
SpringData_自定义Repository方法
①、为某一个Repository 上添加自定义方法
②、为所有的Repository 都添加自实现的方法
如何为某一个Repository 上添加自定义方法
步骤:
①、定义一个接口,声明要添加的,并自实现的方法
②、提供该接口的实现类:类名需要在声明的Repository 后添加Impl,并实现方法
③、声明Repository 接口吧,并继承声明的接口
详解:定义了一个PersonDao 接口,里面有一个test方法
然后 PersonRepository 接口,继承了PersonDao 接口
public interface PersonRepository extends JpaRepository<Person, Integer>,
JpaSpecificationExecutor<Person>, PersonDao{ }
最后PersonRepository 在PersonRepositoryImpl 里面找方法的实现
测试:
//SpringData_自定义Repository方法
@Test
public void testCustomRepositoryMethod(){
personRepository.test();
}
结果:打印出来person