博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-data-jpa原理探秘(4)-JpaQueryExecution类概述
阅读量:7217 次
发布时间:2019-06-29

本文共 1978 字,大约阅读时间需要 6 分钟。

  hot3.png

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

未完待续。

转载于:https://my.oschina.net/ramboo/blog/847679

你可能感兴趣的文章
Qt颜色下拉框
查看>>
31、springboot与任务
查看>>
【转】 一个fork的面试题
查看>>
20131108
查看>>
django.http.request中HttpRequest对象的一些属性与方法
查看>>
英文对应解释
查看>>
Robotics ToolBox机械臂仿真
查看>>
linux添加环境变量
查看>>
【uva 1312】Cricket Field(算法效率--技巧枚举)
查看>>
VS2017 MVC项目,新建控制器提示未能加载文件或程序集“Dapper.Contrib解决方法
查看>>
【ora-err】ORA-03113: end-of-file on communication channel
查看>>
00.索引-综述
查看>>
strcpy
查看>>
AC3 Rematrix
查看>>
C#之Windows Form Application与attribute
查看>>
函数与指针分析实例
查看>>
爬虫:pycurl模块的使用说明
查看>>
Halcon算子翻译——try
查看>>
Win732位安装PostgreSQL9
查看>>
Ext JS4学习笔记1——环境的搭建
查看>>