一、 方法名定义查询
Defining Query Methods
(方法名定义查询)简称DQM
,是MyBatis中没有的,Spring Data JPA中的一大特性,其功能是根据指定规则的方法名定义即可对数据库进行查询、条件过滤、筛选、统计等基本功能,具有统一命名规范,减少SQL
编写提高开发效率等好处。
其优点如下:
统一命名规范
减少SQL编写、提高开发效率
不用死磕方法名
1.1 方法名查询使用方式
通过根据定义方法名
的方式来对数据库进行查询的操作,只需继承JPA中的顶级接口Repository
或者其任意子接口即可实现此功能。
示例代码如下
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{//AND的关系List<User>getUsersByUsernameAndAge(@Param(value="username")Stringusername,@Param(value="age")intage);//OR的关系List<User>getUserByEmailOrPhone(@Param(value="email")Stringemail,@Param(value="phone")Stringphone);//distinct过滤重复List<User>getDistinctByUsername(@Param(value="username")Stringusername);//StartsWith:以...开头的List<User>getUserByUsernameStartsWith(@Param(value="username")Stringusername);//使倒序排序List<User>getUserByUsernameOrderByAgeDesc(@Param(value="username")Stringusername);}
以上根据
方法名语义
定义的方法在测试时只需要调用即可,它们分别能实现以下的功能。
getUsersByUsernameAndAge
根据用户名和年龄两个参数查询出用户的所有数据
getUserByEmailOrPhone
根据邮箱或者电话查询出用户的所有数据
getDistinctByUsername
根据用户名查询出不重复用户的所有数据
getUserByUsernameStartsWith
查询以用户名指定字符开头的所有用户数据
getUserByUsernameOrderByAgeDesc
根据用户名查询出用户的所有数据,并根据age进行倒序排序
下面的表格是DQM
语法中常用的关键字列表,方便使用时查阅
图片来源:拉勾教育
除了表格中以find开头的关键字,JPA还支持
read
、get
、query
、stream
、count
、exists
、delete
、remove
等前缀的方法名语义
Simple Examples ↓
LongcountUserByUserId(LonguserId);//根据用户id统计用户总数voidremoveByUserId(LonguserId);//根据用户id删除用户UserqueryUserByAge(intage);//根据用户年龄查询用户
1.2 特殊查询(First、Top)
当只需要查询个别数据或前几条数据时,可以使用
First
和Top
关键字来定义方法名,使其达到限制的目的。
Code Example
List<User>getFirst3ByOrderByAgeDesc();//查询用户前三条数据,并根据倒序排序List<User>getTop2ByUsername(Stringusername);//根据相同的用户名获取前两条数据
在以上代码中:数字表示查询数据的条目,如果不指定查询的数量,则查询的限制结果默认为1
限制表达式也支持
Distinct
去重复关键字 ??
方法名查询策略配置
DQM的语法有两种,一种是通过方法名语义判断,还有一种是通过@Query
注解实现。这两种方式可以通过@EnableJpaRepositories
来自由切换这两种模式,来决定是使用@Query
还是方法名语义推断
要配置查询策略只需要在启动类上添加@EnableJpaRepositories
注解,并指明配置即可。
//使用了默认策略@EnableJpaRepositories(queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)@SpringBootApplicationpublicclassSpringDataJpaApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SpringDataJpaApplication.class,args);}}
注解里面的QueryLookupStrategy.Key
属性一共有以下三个值
Create
:使用根据方法名语义推断,如果方法名不符合规则,启动的时候会报异常,并且不能使用 @Query
注解,否则会报错。
USE_DECLARED_QUERY
:使用@Query
注解创建,必须要至少有一个或多个@Query
注解相关的方法,如果没有找到将会报错,使用了这种策略就不能使用方法名语义推断
的方式了,和CREATE策略相反。
CREATE_IF_NOT_FOUND
:默认配置,先用声明方式@Query
进行查找,如果没找到相关注解,则会用 Create
的方法名创建规则创建一个查询(语义要符合规范)如果两种都不满足,启动就会报错。
Done.