casewhen多条件查询_峰哥说技术系列-18 .Spring Boot 整合 Spring Data JPA多条件查询

v2-18387e5d3cab7cbd3d6170cb3af9be73_1440w.jpg?source=172ae18b

Spring Boot整合Spring Data JPA

多条件查询和自定义查询

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

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

一、方法的命名查询

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

v2-49048337e0f91ea9c9b714be39c2fcb5_b.jpg

案例

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

v2-0583f67c29e085d779020dde5557a073_b.jpg

v2-d6df58b5d5e13f972cfdd6c8b31b9116_b.jpg

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

v2-1ade75ed7adf7382b7c9b7cac746fd5a_b.jpg

v2-f002f9a9659a6d82291069381fd251c4_b.jpg

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值