1、Spring Data JPA 默认提供了常用的CRUD数据库操作方法;如果我们需要自定义创建自己的操作方法(如根据字段查询和更新),需要如何配置?
2、两种定义查询方法的配置方式,在使用过程中,我们如何设置选择哪种方式(设置查询策略)?
由于Spring JPA Repository的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法:
只需要实体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的值一共有三个。
除非有特殊需求,一般直接用默认的,不用管。配置示例如下
@EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CREATE—IF—NOT—FOUND) public class ExamplelApplication { public static void main(String[] args) { SpringApplication.run(ExamplelApplication.class,args); }
QueryLookupStrategy 是策略的定义接口,jpaQueryLookupStrategy 是具体策略的实现类。