欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring-data-jpa原理探秘(2)-RepositoryQuery的用途和分类

程序员文章站 2022-06-12 14:21:24
...
本系列的第二篇文章,主要讲解在spring-data-jpa中占有重要地位的RepositoryQuery接口的用途和分类。
首先我们看看RepositoryQuery接口极其子类的类图
spring-data-jpa原理探秘(2)-RepositoryQuery的用途和分类
            
    
    博客分类: 程序人生 spring-data-jpaspring-data-jpa原理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实例。

未完待续。