使用自定义方法实现 JpaRepository 接口

Obj*_*tor 2 java spring-data spring-data-jpa spring-boot

我是 Spring Boot 的新手,所以我有几个基本问​​题。

当我们定义一个扩展JpaRepository 的Repository 接口时

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
    Optional<UserInfo> findByEmail(String email);   
    List<UserInfo> findAllByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)

这些方法可以从Service 类调用(我们可能甚至不需要提及这两个方法)。到目前为止,一切都很好。

问题:

  1. 方法是如何findByEmail定义的?幕后又是如何称呼的?

  2. 如果我们想使用原生 SQL 添加自定义方法怎么办findUserAction?在这种情况下,我们需要interface UserInfoRepository在类中声明并定义它UserInfoRepositoryImpl。那么,我们是不是也需要定义其他现有的方法呢?

任何帮助,将不胜感激。提前致谢!:)

Jen*_*der 5

Spring Data 允许您通过多种方式定义查询方法。按您必须完成的工作量(以及您获得的灵活性)排序:

  1. 预定义方法。根据您选择作为存储库基础的接口,您可以免费获得一堆方法:那些在接口中声明的方法。您有CrudRepositoryPagingAndSortingRepositoryJpaRepositoryQueryByExampleExecutorJpaSpecificationExecutor作为选择。这些接口的方法在属于 Spring Data 的类中实现。例如在SimpleJpaRepository.

  2. 查询推导。在这里您可以只声明具有特定命名方案的方法。Spring Data 将解析方法名称并从中构造一个查询,绑定您的参数并执行它。该查询是使用 Jpa Criteria API 创建的。

  3. 查询注释/命名查询。@Query您可以通过添加注释或在实体上声明命名查询或将其放入属性文件中来自行提供查询。Spring Data 将找到它并执行它。它还会添加一些漂亮的东西来添加分页,并且如果您选择使用它们,它将通过 SpEL 处理您的参数。

  4. 最后,您可以提供自己的实现,您可以在其中执行 Java 允许您执行的操作:使用EntityManager或查询数据库JdbcTemplate,根本不访问数据库,而是执行完全不同的操作。

一般来说,整个事情是这样工作的:如果要注入一个存储库,Spring Data 创建一个代理,实现存储库中声明的所有方法。在该代理中,Spring Data 将分析方法调用,决定适用上述哪种情况并执行它。实际上,决定使用什么进程是在启动时完成的,但这对于理解它来说并不重要。

实现方法的所有这些策略都是相互独立的,因此您可以对存储库中的每个方法使用不同的策略。