本系列的第二篇文章,主要讲解在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...
spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa
赠送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...
spring-data-jpa spring data jap
java运行依赖jar包
spring-data-jpa
使用SpringBoot和Spring-data-jpa进行分页查询可以大大简化编码流程并提高开发效率。 在使用Spring-data-jpa进行分页查询时,需要遵循以下步骤: 引入依赖 在pom.xml文件中加入spring-boot-starter-data-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文档和源代码
java运行依赖jar包
实现spring-data-jpa的增删改查方法,该项目是maven项目,需要maven支持
java运行依赖jar包
spring-data-jpa-1.5.2
NULL 博文链接:https://mybar.iteye.com/blog/1863390
springboot-spring-data-jpa项目练习,整合了增删改查springboot-spring-data-jpa项目练习,整合了增删改查
使用SpringBoot 集成Spring-data-jpa,Druid连接池,thymeleaf模板实现的一个简单网上商城项目
spring-data-jpa知识。
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
spring-data-jpa-1.4.2.RELEASE.jar
spring-data-jpa-reference1.3.pdf
spring-data-jpa-reference.pdf