SpringBoot JPA实践之@Query查询之参数传参方式
JPAadmin 发布于:2020-04-29 23:07:45
阅读:loading
@Query注解查询是一个非常强大的查询实现,基本上日常的各种复杂查询使用它均可实现,本篇文章主要介绍使用@Query查询时的参数传递实现方式,常用的参数传递有3中方式,分别是“?”、“?数字”、“:属性”,第一种最常见,但是不能用于动态个数的参数,后面两种则可以满足动态参数个数的场景,所以后面的两种更加强大,但是使用“:属性”的方式比使用“?数字”的方式更加易于阅读,所以我也建议使用第三种方式。
“?”:与JDBC中的参数赋值类似,这个类型的大家肯定不会陌生,当一个参数被使用一次以上时,此种方式需要定义两个参数,并且不支持动态个数的参数;
“?数字”:可以满足一个参数被使用多次,并且某个参数类型是数组或者集合的场景,底层解析逻辑是识别到特定规则的数字时候,替换为对应的第数字个参数(猜的);
“:属性”:同上,更加易于阅读,底层解析逻辑是识别特殊规则的属性名与方法中方法参数命名的匹配(猜的);
“:#{#对象名称.属性名称}”:既:#{#user.name},主要用于方法参数较多的情况,由此方式可以来避免方法出现更多的参数;
/**
* 查询参数类型传值方式
*
* @author chendd
* @date 2020/4/30 23:26
*/
public interface UserQueryParamTypeRepository extends BaseRepository<User, String> {
/**
* 第一种参数传递,使用 ? 占位符
* 传统预编译参数传值方式
*/
@Query(value = "select * from user where name = ? " +
"and email like concat(concat('%',?),'%')" , nativeQuery = true)
List<User> queryUsersByNameAndEmailForOneType(String name , String email);
/**
* 第二种参数传递,使用 ?数字 占位符
* ?数字释义:?为占位符,数字为获取的参数下标
*/
@Query(value = "select * from user where (name = ?1 or ?1 is null) " +
"and email like concat(concat('%',?2),'%')" , nativeQuery = true)
List<User> queryUsersByNameAndEmailForTwoType(String name , String email);
/**
* 第三种参数传递,使用 :属性名 占位符
* 用于参数个数为动态长度时,支持数组与集合
*/
@Query(value = "select * from user where name in (:nameList) and name in (:nameArray) " +
"and email like concat(concat('%', :email ),'%')" , nativeQuery = true)
List<User> queryUsersByNameAndEmailForThreeType(@Param("nameList") List<String> nameList ,
@Param("nameArray") String nameArray[] ,
@Param("email") String email);
}
/**
* Query查询参数传值方式
*
* @author chendd
* @date 2020/4/30 23:25
*/
public class UserQueryParamTypeTest extends ApplicationTest {
@Resource
private UserQueryParamTypeRepository repository;
@Test
public void testQueryByNameAndEmailForOneType() {
List<User> dataList = repository.queryUsersByNameAndEmailForOneType("chendd", "88");
Assert.assertNotNull(dataList);
}
@Test
public void testQueryByNameAndEmailForTwoType() {
List<User> dataList = repository.queryUsersByNameAndEmailForTwoType("chendd" , "88");
Assert.assertNotNull(dataList);
}
@Test
public void testQueryByNameAndEmailForThreeType() {
String nameArray[] = {"chendd" , "cdd"};
List<String> nameList = Lists.newArrayList(nameArray);
List<User> dataList = repository.queryUsersByNameAndEmailForThreeType(nameList , nameArray , "88");
System.out.println(dataList);
Assert.assertNotNull(dataList);
}
}
(1)本篇文章实现了使用@Query注解查询的基本应用,包含了参数等值查询、参数模糊查询、及参数集合 in 的查询方式,其中查询 in 的时候支持传递 String[] 与 List 类型;
(2)上述三种参数传递方式,个人喜欢使用第三种“:属性”的方式,更为直观且同一个参数可被重复使用;
点赞
发表评论
评论列表
留言区
- SpringBoot JPA实践之框架搭建
- SpringBoot JPA实践之BaseRepository
- SpringBoot JPA实践之自动生成Entity
- SpringBoot JPA实践之API介绍
- SpringBoot JPA实践之方法属性名查询
- SpringBoot JPA实践之Example对象查询
- SpringBoot JPA实践之Named查询
- SpringBoot JPA实践之@Query查询之动态查询条件
- SpringBoot JPA实践之@Query查询之接口结果集
- SpringBoot JPA实践之@Query查询之分页实现
- SpringBoot JPA实践之EntityManage查询返回自定义DTO
- SpringBoot JPA实践之EntityManage查询返回自定义DTO的代理实现
- SpringBoot JPA实践之Specification查询分页
- SpringBoot JPA实践之表达式自定义属性与方法
- SpringBoot JPA实践之小技巧汇总