likes
comments
collection
share

spring-data-jpa(方法定义查询)

作者站长头像
站长
· 阅读数 16

一、 方法名定义查询

Defining Query Methods(方法名定义查询)简称DQM,是MyBatis中没有的,Spring Data JPA中的一大特性,其功能是根据指定规则的方法名定义即可对数据库进行查询、条件过滤、筛选、统计等基本功能,具有统一命名规范,减少SQL编写提高开发效率等好处。

  • 其优点如下

    • 统一命名规范
    • 减少SQL编写、提高开发效率
    • 不用死磕方法名 spring-data-jpa(方法定义查询)

1.1 方法名查询使用方式

通过根据定义方法名的方式来对数据库进行查询的操作,只需继承JPA中的顶级接口Repository或者其任意子接口即可实现此功能。

  • 示例代码如下
public interface UserRepository extends JpaRepository<User, Long> {

    // AND的关系
    List<User> getUsersByUsernameAndAge(@Param(value = "username") String username,
                                        @Param(value = "age") int age);

    // OR的关系
    List<User> getUserByEmailOrPhone(@Param(value = "email") String email,
                                     @Param(value = "phone") String phone);

    // distinct 过滤重复
    List<User> getDistinctByUsername(@Param(value = "username") String username);

    // StartsWith:以...开头的
    List<User> getUserByUsernameStartsWith(@Param(value = "username") String username);

    // 使倒序排序
    List<User> getUserByUsernameOrderByAgeDesc(@Param(value = "username") String username);
}

以上根据方法名语义定义的方法在测试时只需要调用即可,它们分别能实现以下的功能。

  • getUsersByUsernameAndAge

    • 根据用户名和年龄两个参数查询出用户的所有数据
  • getUserByEmailOrPhone

    • 根据邮箱或者电话查询出用户的所有数据
  • getDistinctByUsername

    • 根据用户名查询出不重复用户的所有数据
  • getUserByUsernameStartsWith

    • 查询以用户名指定字符开头的所有用户数据
  • getUserByUsernameOrderByAgeDesc

    • 根据用户名查询出用户的所有数据,并根据age进行倒序排序

下面的表格是DQM语法中常用的关键字列表,方便使用时查阅

spring-data-jpa(方法定义查询)

图片来源:拉勾教育

除了表格中以find开头的关键字,JPA还支持readgetquerystreamcountexistsdeleteremove 等前缀的方法名语义

  • Simple Examples ↓
Long countUserByUserId(Long userId)// 根据用户id统计用户总数
void removeByUserId(Long userId)// 根据用户id删除用户
User queryUserByAge(int age)// 根据用户年龄查询用户

1.2 特殊查询(First、Top)

当只需要查询个别数据或前几条数据时,可以使用FirstTop关键字来定义方法名,使其达到限制的目的。

  • Code Example
List<User> getFirst3ByOrderByAgeDesc()// 查询用户前三条数据,并根据倒序排序
List<User> getTop2ByUsername(String username)// 根据相同的用户名获取前两条数据

在以上代码中:数字表示查询数据的条目,如果不指定查询的数量,则查询的限制结果默认为1

限制表达式也支持 Distinct 去重复关键字 👨‍💻

方法名查询策略配置

DQM的语法有两种,一种是通过方法名语义判断,还有一种是通过@Query注解实现。这两种方式可以通过@EnableJpaRepositories 来自由切换这两种模式,来决定是使用@Query还是方法名语义推断

  • 要配置查询策略只需要在启动类上添加@EnableJpaRepositories注解,并指明配置即可。
// 使用了默认策略
@EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
@SpringBootApplication
public class SpringDataJpaApplication {

public static void main(String[] args) {
    SpringApplication.run(SpringDataJpaApplication.class, args);
  }
}

注解里面的QueryLookupStrategy.Key属性一共有以下三个值

  • Create:使用根据方法名语义推断,如果方法名不符合规则,启动的时候会报异常,并且不能使用 @Query注解,否则会报错。
  • USE_DECLARED_QUERY:使用@Query注解创建,必须要至少有一个或多个@Query注解相关的方法,如果没有找到将会报错,使用了这种策略就不能使用方法名语义推断的方式了,和CREATE策略相反。
  • CREATE_IF_NOT_FOUND:默认配置,先用声明方式@Query进行查找,如果没找到相关注解,则会用 Create 的方法名创建规则创建一个查询(语义要符合规范)如果两种都不满足,启动就会报错。

Done.