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實例。未完待續。