什么是SpringDataJpa:
就是对jpa进行封装,从而形成的一个框架。封装之后,使用更加简单
SpringDataJpa需要的jar包
<!-- SpringData的支持包 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.9.0.RELEASE</version>
</dependency>
SpringDataJpa的crud
用法:定义一个接口 继承 JpaRepository这个接口
新增/修改 save
employeeRepository.save(employee)
查询 findOne
employeeRepository.findOne(id)
查询所有 findAll
employeeRepository.findAll()
删除 delete /deleteInBatch
employeeRepository.delete(id)
SpringDataJpa的分页和排序
Sort sort = new Sort(Sort.Direction.DESC,"age");
//分页和排序
Pageable pageable = new PageRequest(0, 10,sort);
Page<Employee> page = employeeRepository.findAll(pageable);
按照条件规则查询(只适合简单的查询)
public interface EmployeeRepository extends JpaRepository<Employee,Long> {
//按照规则条件进行查询 模糊查询
public List<Employee> findByUsernameLike(String username);
public List<Employee> findByUsername(String username);
public List<Employee> findByAgeGreaterThan(Integer age);
}
Query注解式jpql查询
//Query注解查询
@Query("select o from Employee o where o.id =(select max(p.id) from Employee p)")
public Employee queryEmployee();
//根据用户名和邮件查询员工 参数名称 建议写来一致
@Query("select o from Employee o where o.username like ?1 and o.email like ?2")
public List<Employee> queryEmployee1(String name ,String email);
//@Param(username) 必须和 :username 一致 建议来都写来一致
@Query("select o from Employee o where o.username like :username and o.email like :email")
public List<Employee> queryEmployee2(@Param("username") String name ,@Param("email") String email);
//原生SQL支持
@Query(value = "select count(*) from employee ",nativeQuery = true)
public Long queryCount();
}
JpaSpecificationExecutor 查询
JpaSpecificationExecutor:jpa提供的规范的执行者,作用是可以用来动态的生成jpql语句来查询,完成一些复杂查询
@Test
public void testJpaSpecificationExecutorAndPage()throws Exception{
//Specification
Specification specification = new Specification<Employee>(){
//设置条件 给哪一列(username)设置条件
//root
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Path path1 = root.get("username"); //root 拿到要操作的字段
//criteriaBuilder 用来构建的查询
Predicate predicate1 = criteriaBuilder.like(path1, "%1%");
Path path2 = root.get("age");
Predicate predicate2 = criteriaBuilder.greaterThan(path2, 30);
CriteriaQuery cq = criteriaQuery.where(predicate1, predicate2);
return cq.getRestriction();
}
};
// select o from Employee o where username like '%1%' and age > 30
Sort sort = new Sort(Sort.Direction.DESC,"age");
Pageable pageable = new PageRequest(0, 2, sort);
Page<Employee> page = employeeRepository1.findAll(specification,pageable);
List<Employee> employees = page.getContent();
for (Employee employee : employees) {
System.out.println(employee);
}
}
上面麻烦地方:组装条件比较麻烦,所以有人写了一个简单的插件 完成内容(jpa-spe)
jpa-spe插件
jpa-spec对JpaSpecificationExecutor进行了封装,封装之后,简化上面jpa查询规则的写法,更好用
用法:
(1)导入依赖包
<!-- SpringData的扩展包 -->
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.1.1</version>
<!-- 把所有的依赖都去掉 不然会和springdatajpa的把引起冲突-->
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
(2)测试
@Test
public void testJpaSpe()throws Exception{
Specification<Employee> specification = Specifications.<Employee>and()
.like("username", "%1%")
.gt("age", 30)
.build();//构造/构建
List<Employee> employees = employeeRepository1.findAll(specification);
for (Employee employee : employees) {
System.out.println(employee);
}
}