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

未完待續。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章