Spring Boot整合Spring Data JPA
多条件查询和自定义查询
各位小伙伴,今天的内容,大家必须在我上次的文章《Spring Boot整合Spring Data JPA》的基础上继续进行。大家先完成或者理解上次的知识才跟的上节奏,方便继续写代码。
Spring Data JPA除了提供的默认的方法外,我们还可是根据需要使用命名查询和自定义查询,也非常简单。
一、方法的命名查询
在spring data jpa中,只要方法的定义符合既定的规范,Spring Data Jpa就能分析出开发者的意图,从而避免开发者定义SQL,所谓的既定规范,就是一定的方法命名规则,支持的命名规则如下表。
案例
根据spring data jpa的既定命名规范,完成如下的查询。
(1)查询姓名为男,编号大于5的员工。
(2)查询姓名中包含“乔”的员工。
步骤:
01修改EmpDao,添加方法如下
public interface EmpDao extends JpaRepository<Emp,Integer> {
//查询姓名为男,编号大于5的员工
public List<Emp> findByIdGreaterThanAndSexEquals(Integer id,String sex);
//查询姓名中包含“乔”的员工
public List<Emp> findByNameContaining(String name);
}02修改EmpService,添加方法如下
@Service
@Transactional
public class EmpService {
@Autowired
private EmpDao empDao;
public List<Emp> findByIdGreaterThanAndSexEquals(Integer id,String sex){
return empDao.findByIdGreaterThanAndSexEquals(id,sex);
}
public List<Emp> findByNameContaining(String name){
return empDao.findByNameContaining(name);
}
}
03修改EmpController,添加方法如下
@RestController
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/condition1")
public List<Emp> findByIdGreaterThanAndSexEquals(@RequestParam Integer id,@RequestParam String sex){
return empService.findByIdGreaterThanAndSexEquals(id,sex);
}
@GetMapping("/condition2")
public List<Emp> findByNameContaining(@RequestParam String name){
return empService.findByNameContaining(name);
}
}
04在postman中进行测试,结果如下。
既定的方法命名规则,不能一定能满足所有的开发需要,所以Spring Data JPA也支持自定义JPQL(Java Persistence Query Language)或者原生的SQL查询。
案例:
(1)查询员工编号大于等于2小于等于8,同时性别为男的员工。
(2)查询性别为女的员工编号大于3的员工总记录数。
步骤:
01修改EmpDao,添加方法如下
public interface EmpDao extends JpaRepository<Emp,Integer> {
//查询员工编号大于等于2小于等于8,同时性别为男的员工。
@Query(value = "select e from t_emp e where e.id>=:minId and e.id<=:maxId and e.sex=:sex")
public List<Emp> findByIdAndSex(@Param("minId") Integer minId, @Param("maxId") Integer maxId, @Param("sex") String sex);
//查询性别为女的员工编号大于3的员工总记录数。
@Query(value = "select count(1) from t_emp e where e.id>:id and e.sex=:sex",nativeQuery = true)
public Long countBySexWithId(@Param("sex") String sex,@Param("id") Integer id);
}
这里的:minId是命名的占位符,他和@Param注解中的名字要一致。否则参数无法传入会出现错我。@Query注解的用法是不是写的差不多是SQL语句。相对来说也很简单的。这样对于比较复杂的,理解一下即可。
02修改EmpService,添加方法如下
@Service
@Transactional
public class EmpService {
@Autowired
private EmpDao empDao;
public List<Emp> findByIdAndSex(Integer minId,Integer maxId,String sex){
return empDao.findByIdAndSex(minId,maxId,sex);
}
public Long countBySexWithId(String sex, Integer id){
return empDao.countBySexWithId(sex,id);
}
}03修改EmpController,添加方法如下
@RestController
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/condition3")
public List<Emp> findByIdAndSex(@RequestParam Integer minId,@RequestParam Integer maxId,@RequestParam String sex){
return empService.findByIdAndSex(minId,maxId,sex);
}
@GetMapping("/count")
public Long countBySexWithId(@RequestParam("sex") String sex, @RequestParam("id") Integer id){
return empService.countBySexWithId(sex,id);
}
}
04在postman中进行测试,结果如下。
至此,峰哥说技术,关注数据库整合和使用方面就给各位小伙伴介绍到这里。对于数据库的操作是非常重要的内容,希望大家能熟练的使用。