本系列的第二篇文章,主要讲解在spring-data-jpa中占有重要地位的RepositoryQuery接口的用途和分类。
首先我们看看RepositoryQuery接口极其子类的类图
上图很清晰的说明,RepositoryQuery接口包含SimpleJpaQuery,NativeJpaQuery,PartTreeJpaQuery,NamedQuery,StoredProcedureJpaQuery等(叶子节点)子类。
JpaRepositoryFactory类在动态实例化Repository接口时,其父类RepositoryFactorySupport定义了一个私有Map类变量:
private final Map<Method, RepositoryQuery> queries = new ConcurrentHashMap<Method, RepositoryQuery>();
而动态实例化Repository接口时,将实例化一个QueryExecutorMethodInterceptor,为其增加监听和interceptor。上篇文章提到过,QueryExecutorMethodInterceptor是RepositoryFactorySupport的内部类,实现了org.aopalliance.intercept.MethodInterceptor拦截器接口。
实例化QueryExecutorMethodInterceptor时会直接执行其构造器,我们看到,给每个方法都创建了一个RepositoryQuery实例,并put到了上面所说的ConcurrentHashMap私有Map类变量中,代码如下:
for (Method method : queryMethods) {
RepositoryQuery query = lookupStrategy.resolveQuery(method, repositoryInformation, factory, namedQueries);
invokeListeners(query);
queries.put(method, query);
}
RepositoryQuery的直接抽象子类是AbstractJpaQuery,可以看到,一个RepositoryQuery实例持有一个JpaQueryMethod实例,JpaQueryMethod又持有一个Method实例,所以RepositoryQuery实例的用途很明显,一个RepositoryQuery代表了Repository接口中的一个方法,根据方法头上注解不同的形态,将每个Repository接口中的方法分别映射成相对应的RepositoryQuery实例。
下面我们就来看看spring-data-jpa对RepositoryQuery实例的具体分类:
1.SimpleJpaQuery
方法头上@Query注解的nativeQuery属性缺省值为false,也就是使用JPQL,此时会创建SimpleJpaQuery实例,并通过两个StringQuery类实例分别持有query jpql语句和根据query jpql计算拼接出来的countQuery jpql语句;
2.NativeJpaQuery
方法头上@Query注解的nativeQuery属性如果显式的设置为nativeQuery=true,也就是使用原生SQL,此时就会创建NativeJpaQuery实例;
3.PartTreeJpaQuery
方法头上未进行@Query注解,将使用spring-data-jpa独创的方法名识别的方式进行sql语句拼接,此时在spring-data-jpa内部就会创建一个PartTreeJpaQuery实例;
4.NamedQuery
使用javax.persistence.NamedQuery注解访问数据库的形式,此时在spring-data-jpa内部就会根据此注解选择创建一个NamedQuery实例;
5.StoredProcedureJpaQuery
顾名思义,在Repository接口的方法头上使用org.springframework.data.jpa.repository.query.Procedure注解,也就是调用存储过程的方式访问数据库,此时在spring-data-jpa内部就会根据@Procedure注解而选择创建一个StoredProcedureJpaQuery实例。
未完待续。
分享到:
相关推荐
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
这两个模块的 jar 文件,`spring-data-commons-1.7.2.RELEASE.jar` 和 `spring-data-jpa-1.5.2.RELEASE.jar`,包含了它们各自的功能实现和依赖。在实际项目中,将这些 jar 文件添加到类路径,就可以利用 Spring Data...
java运行依赖jar包
java运行依赖jar包
spring-data-jpa
Spring-data-jpa 与 Spring 的整合非常紧密,它利用 Spring 的依赖注入和事务管理功能,使得开发者可以轻松地在应用程序中集成数据访问逻辑。下面将详细介绍整合的关键步骤: 1. **配置 JPA 实体管理器**: - 在 ...
Spring Data JPA 可以看作是对 JPA 的进一步封装和简化,它能够帮助开发者更快地实现对数据的增删改查操作。 在使用Spring Data JPA时,首先需要理解项目依赖,它通常会依赖于Spring框架的核心模块以及JPA规范实现...
spring data jpa最新版本1.8.0,包含了spring-data-jpa-1.8.0.RELEASE.jar,spring-data-jpa-1.8.0.RELEASE-javadoc.jar以及 spring-data-jpa-1.8.0.RELEASE-sources.jar文档和源代码
2. Spring-data-jpa:Spring-data-jpa是Spring Data项目的一部分,它简化了使用JPA(Java Persistence API)进行数据库操作。它提供了对JPA的封装,让开发者可以通过Repository接口就能实现数据的CRUD操作,而无需...
java运行依赖jar包
java运行依赖jar包
spring-data-jpa-1.4.2.RELEASE.jar
在这个实例中,我们将探讨如何设置和使用 Spring Data JPA 实现简单的数据库操作。 1. **环境配置** 首先,确保你的项目是一个 Maven 项目,因为 Spring Data JPA 的依赖管理主要通过 Maven 进行。在 `pom.xml` ...
java运行依赖jar包
spring-data-jpa-1.5.2
通过深入学习这个 "spring-data-jpa-example" 项目,初学者可以理解如何在 Spring 应用中集成 JPA,如何创建和使用 Repository,以及如何组织服务和控制层。这有助于快速上手基于 Spring Data JPA 的数据访问层开发...
SpringBoot与Spring Data JPA是Java开发中常用的两个框架,它们极大地简化了Web应用和数据库交互的复杂性。本项目练习旨在帮助开发者深入理解和实践这两个技术的集成与使用。 Spring Boot是一个快速开发框架,它...
spring-data-jpa-extra可以解决三个问题: 动态本地查询支持,例如mybatis 返回类型可以是任何东西没有代码,只有sql例子首先添加ComponentScan 通过java bean @ComponentScan ({ " com.slyak " , " your.base....