转载

Spring Data JPA 定义查询方法:配置方法和查询策略

1、Spring Data JPA 默认提供了常用的CRUD数据库操作方法;如果我们需要自定义创建自己的操作方法(如根据字段查询和更新),需要如何配置?

2、两种定义查询方法的配置方式,在使用过程中,我们如何设置选择哪种方式(设置查询策略)?

一、定义查询方法的配置方法

由于Spring JPA Repository的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法:

  1. 从方法名称中可以指定特定用于存储的查询和更新,
  2. 或通过使用@Query手动定义的查询,这个取决于实际存储操作。

只需要实体Repository继承Spring Data Common里面的Repository接口即可。

如果你想有其他更多默认通用方法的实现,可以选择JpaRepository、PagingAndSortingRepository、CrudRepository等接口,也可以直接继承我们后面要讲的JpaSpecificationExecutor、QueryByExampleExecutor和自定义Response,都可以达到同样的效果。

如果你不想扩展Spring数据接口,还可以使用它来注解存储库接口@RepositoryDefinition。扩展CrudRepository公开了一套完整的方法来操纵实体。如果你希望对所暴露的方法有选择性,只需要将暴露的方法复制CrudRepository到域库中即可。其实也是自定义Repository的一种。

看下面的示例,选择性地暴露CRUD方法:(findOne和save)

@NoRepositoryBeaninterface
MyBaseRepository<T, ID extends Serializable> extends Rep〇sit〇ry<T, ID> { 
T find〇ne(ID id);
T save(T entity);
}
interface UserRepository extends MyBaseRepository<User, Long> {
User findByEmailAddress(EmailAddress emailAddress);
}

在这个示例的第一步中为所有域存储库定义了一个公共基础接口,并将其暴露出来。findOne(…)和save(…)方法将被路由到由Spring Data提供的、你选择的存储库的基本存储库实现中。

例如JPA中的SimpleJpaRepository。因为它们正在匹配方法签名CrudRepository,所以UserRepository将能够保存用户,并通过id查找单个用户信息,以及触发查询以通过其电子邮件地址查找Users。

二、方法的查询策略设置

通过@EnableJpaRepositories(queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)可以配置方法的查询策略,其中QueryLookupStrategy.Key的值一共有三个。

  1. CREATE:直接根据方法名进行创建。规则是根据方法名称的构造进行尝试,一般的方法是从方法名中删除给定的一组已知前缀,并解析该方法的其余部分。如果方法名不符合规则,启动的时候就会报异常。
  2. USE_DECLARED_QUERY:声明方式创建,即本书说的注解方式。启动的时候会尝试找到一个声明的查询,如果没有找到就将抛出一个异常。查询可以由某处注释或其他方法声明。
  3. CREATE_IF_NOT_FOUND:这个是默认的,以上两种方式的结合版。先用声明方式进行查找,如果没有找到与方法相匹配的查询,就用create的方法名创建规则创建一个查询。

除非有特殊需求,一般直接用默认的,不用管。配置示例如下

@EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CREATE—IF—NOT—FOUND) 
public class ExamplelApplication {
public static void main(String[] args) {
SpringApplication.run(ExamplelApplication.class,args);
}

QueryLookupStrategy 是策略的定义接口,jpaQueryLookupStrategy 是具体策略的实现类。

原文  https://cn-blogs.cn/archives/8455.html
正文到此结束
Loading...