1. 程式人生 > >spring-data-jpa原理探祕(4)-JpaQueryExecution類概述

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例項。

未完待續。