`
sharong
  • 浏览: 493248 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8714
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13053
社区版块
存档分类
最新评论

spring-data-jpa原理探秘(4)-JpaQueryExecution类概述

阅读更多
spring-data-jpa原理的第四篇,来说说JpaQueryExecution相关类。首先给出类图和继承关系:

spring-data-jpa中对JpaQueryExecution有明确说明:
包含多个查询运行策略的类的集合。根据大多数org.springframework.data.repository.query.QueryMethod以及AbstractStringBasedJpaQuery中的返回类型,可以在各种风格中执行。

我们看到,spring-data-jpa使用了内部类来实现JpaQueryExecution的子类,也就是包含多个查询运行策略的(子)类。这么做其实是一种相对的封闭形式,造成使用者只能实例化spring-data-jpa给出的这8种子类。你无法实现自己的JpaQueryExecution子类,在spring框架初始化时通过配置加载之。

事实上JpaQueryExecution的作用就是,对类变量JpaQueryMethod method类实例进行判断,通过AbstractJpaQuery类的protected JpaQueryExecution getExecution()方法,选择一个JpaQueryExecution的子类进行实例化。
下面是AbstractJpaQuery抽象类的getExecution()方法代码:
	protected JpaQueryExecution getExecution() {

		if (method.isStreamQuery()) {
			return new StreamExecution();
		} else if (method.isProcedureQuery()) {
			return new ProcedureExecution();
		} else if (method.isCollectionQuery()) {
			return new CollectionExecution();
		} else if (method.isSliceQuery()) {
			return new SlicedExecution(method.getParameters());
		} else if (method.isPageQuery()) {
			return new PagedExecution(method.getParameters());
		} else if (method.isModifyingQuery()) {
			return method.getClearAutomatically() ? new ModifyingExecution(method, em) : new ModifyingExecution(method, null);
		} else {
			return new SingleEntityExecution();
		}
	}

代码很简单,一目了然,根据method变量实例化时的查询设置方式,实例化不同的JpaQueryExecution子类实例去运行,如果难以判断,最后进入else判断语句,生成一个SingleEntityExecution实例。

SingleEntityExecution是JpaQueryExecution 8个内部子类其中的一个,全部代码如下:
static class SingleEntityExecution extends JpaQueryExecution {
	@Override
	protected Object doExecute(AbstractJpaQuery query, Object[] values) {
		return query.createQuery(values).getSingleResult();
	}
}

SingleEntityExecution只覆盖了一个父类方法,而且实现里只有一条语句query.createQuery(values).getSingleResult();在执行这句时,会调用底层数据库访问提供商,spring-data-jpa默认选择的是hibernate,执行数据库存取操作之后,将结果返回给这个JpaQueryExecution实例。

未完待续。
1
0
分享到:
评论
1 楼 MCLoginandPwd 2017-08-11  
分享一款代码生成器,拖拽式组件结合流式处理,很容易的访问数据库、http、文件读写操作等等,支持编写javascript、java、freemaker,功能丰富强大,编制规则,可生成一切想要的代码,详见:http://blog.csdn.net/LoginandPwd/article/details/76944900,更多资讯:http://blog.csdn.net/LoginandPwd/article

相关推荐

Global site tag (gtag.js) - Google Analytics