Spring Boot整合Spring Data JPA

多条件查询和自定义查询

各位小伙伴,今天的内容,大家必须在我上次的文章《Spring Boot整合Spring Data JPA》的基础上继续进行。大家先完成或者理解上次的知识才跟的上节奏,方便继续写代码。

Spring Data JPA除了提供的默认的方法外,我们还可是根据需要使用命名查询和自定义查询,也非常简单。

一、方法的命名查询

在spring data jpa中,只要方法的定义符合既定的规范,Spring Data Jpa就能分析出开发者的意图,从而避免开发者定义SQL,所谓的既定规范,就是一定的方法命名规则,支持的命名规则如下表。


by java 实现多条件group java 多条件查询_es多条件查询


案例

根据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中进行测试,结果如下。


by java 实现多条件group java 多条件查询_es多条件查询_02


by java 实现多条件group java 多条件查询_es 多条件查询_03


既定的方法命名规则,不能一定能满足所有的开发需要,所以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中进行测试,结果如下。


by java 实现多条件group java 多条件查询_casewhen多条件查询_04


by java 实现多条件group java 多条件查询_casewhen多条件查询_05


至此,峰哥说技术,关注数据库整合和使用方面就给各位小伙伴介绍到这里。对于数据库的操作是非常重要的内容,希望大家能熟练的使用。