CN109669951A - 对象查询方法、装置、计算机设备和存储介质 - Google Patents
对象查询方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN109669951A CN109669951A CN201811330726.6A CN201811330726A CN109669951A CN 109669951 A CN109669951 A CN 109669951A CN 201811330726 A CN201811330726 A CN 201811330726A CN 109669951 A CN109669951 A CN 109669951A
- Authority
- CN
- China
- Prior art keywords
- sentence
- oql
- original
- entity
- domain model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及一种对象查询方法、装置、计算机设备和存储介质。所述方法包括:获取原始OQL语句,确定原始OQL语句中的对象信息;将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系;根据映射关系和分库路由配置,将原始OQL语句转换为各数据库查询的SQL语句,该分库路由配置为查询领域模型的对象位置的配置。采用本方法能够实现同时在多个数据库中查询对象。
Description
技术领域
本申请涉及数据库操作领域,特别是涉及一种对象查询方法、装置、计算机设备和存储介质。
背景技术
Object Query Language(面向对象的查询语言,简称OQL),是将SQL(StructuredQuery Language,结构化查询语言)编程和面向对象的编程范例结合在一起的一种标准化语言。OQL作为面向对象数据库管理系统的一个有机组成部分,其查询的目标是数据库中的对象。
对于一些企业来说,系统数据会按照应用分类,分布存储在多个数据库中,往往需要同时查询多个数据库中的对象,但目前的OQL只能查询单个数据库中的对象,无法满足企业的需求。
发明内容
基于此,有必要针对目前的OQL只能查询单个数据库中的对象的问题,提供一种能够同时查询多个数据库的对象查询方法、装置、计算机设备和存储介质。
一种对象查询方法,所述方法包括:
获取原始OQL语句,确定所述原始OQL语句中的对象信息;
将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系;
根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置。
在其中一个实施例中,所述确定所述原始OQL语句中的对象信息的步骤包括:
分析所述原始OQL语句;
确定所述原始OQL语句中的对象和对应的属性。
在其中一个实施例中,所述将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系的步骤包括:
将所述原始OQL语句中的根对象与领域模型中的聚合根实体建立映射关系;
将所述原始OQL语句中根对象的属性与所述领域模型中聚合根实体的属性建立映射关系;
将所述原始OQL语句中的子对象与所述领域模型中的聚合根实体引用的实体对象建立映射关系;
将所述原始OQL语句中子对象的属性与所述领域模型中的聚合根实体引用的实体对象的属性建立映射关系。
在一个实施例中,所述将所述原始OQL语句中的子对象与所述领域模型中的聚合根实体引用的实体对象建立映射关系的步骤包括:
将所述原始OQL语句中的不同子对象与所述领域模型中的聚合根实体引用的不同类型的实体对象分别建立对应的映射关系;
将所述原始OQL语句中根对象对子对象的引用和所述领域模型中的聚合根实体对实体对象的引用建立映射关系。
在一个实施例中,所述将所述原始OQL语句中根对象对子对象的引用和所述领域模型中的聚合根实体对实体对象的引用建立映射关系的步骤包括:
确定所述原始OQL语句中的主键和外键;
将所述原始OQL语句中的主键和外键与所述领域模型中的主键和外键建立映射关系。
在一个实施例中,所述根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置的步骤包括:
根据分库路由配置和所述领域模型中的聚合根实体生成SQL语句中的主表;
根据所述领域模型中聚合根实体的属性生成SQL语句中主表的列;
根据所述分库路由配置和所述领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表;
根据所述领域模型中的聚合根实体引用的实体对象的属性生成SQL语句中关联表的属性。
在一个实施例中,所述根据所述领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表的步骤之后,还包括:
根据所述领域模型中的聚合根实体对实体对象的引用确定SQL语句中的主键和外键;
当所述领域模型中的聚合根实体对实体对象的引用关系是多对多时,在SQL语句中创建新表以确定多个主表与多个关联表的关联关系。
一种对象查询装置,所述装置包括:
确定模块,用于获取原始OQL语句,确定所述原始OQL语句中的对象信息;
映射模块,用于将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系;
生成模块,用于根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述任一方法步骤。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一方法步骤。
上述对象查询方法、装置、计算机设备和存储介质,通过获取原始OQL语句,确定原始OQL语句中的对象信息,将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系,根据该映射关系和查询领域模型的对象位置的分库路由配置,将原始OQL语句转换为各数据库查询的SQL语句,能够实现同时在多个数据库中查询对象。
附图说明
图1为一个实施例中对象查询方法的应用环境图;
图2为一个实施例中对象查询方法的流程示意图;
图3为一个实施例中建立映射关系步骤的流程示意图;
图4为另一个实施例中OQL与领域模型建立映射关系的示意图;
图5为一个实施例中OQL语句转换成SQL语句步骤的流程示意图;
图6为另一个实施例中对象查询方法的流程示意图;
图7为另一个实施例中OQL语句映射到领域模型中的关系图;
图8为一个实施例中对象查询装置的结构框图;
图9为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例提供的对象查询方法,可以应用于如图1所示的应用环境中。其中,计算机设备102可以是终端或服务器,终端可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备,服务器可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
在一个实施例中,如图2所示,提供了一种对象查询方法,以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:
步骤202,获取原始OQL语句,确定该原始OQL语句中的对象信息。
其中,原始OQL语句是指计算机设备接收到的还未进行处理的OQL语句。对象是指要查询的数据表。对象信息是指对象的类别、对象名称和对象属性等。例如,对象类别可以分为根对象和子对象,对象属性可以是对象之间的关联属性或排序属性等。
具体地,计算机设备获取原始OQL语句,对该OQL语句进行语义和语法分析,确定该OQL语句中存在的对象和各个对象具有的属性,以及各对象之间的关联关系。本实施例中,自定义了OQL语句的语法,例如,OQL语句的自定义如下:
SELECT[TOP N][DISTINCT][fieldExps]
FROM entityName
[WHERE conditionExps]
[GROUP BY fieldExps HAVING conditionExps]
[ORDER BY fieldExps]
SELECT TOP n定义为取前n个对象,一个对象可能对应SQL语句的多行记录。SELECT FROM X定义为fieldExps为空,查询X对象的所有列和其分录的所有列,以及其引用的基础资料的默认列,可能还包括在领域模型中引用基础资料可选择选取的列。
步骤204,将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系。
其中,领域模型是描述业务实现的模型,是对领域内的概念类或现实世界中对象的可视化表示,包括实体、值对象、聚合(关系)、服务、事件、工厂、存储、上下文等。映射关系是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。映射本质上就是将数据从一种形式转换到另外一种形式。
具体地,计算机设备确定原始OQL语句中的对象和各个对象具有的属性,以及各对象之间的关联关系后,从领域模型中调用与之相应的对象信息,并且将两者的对象信息一一建立映射关系,原始OQL语句中的所有对象信息都要映射到领域模型中。
步骤206,根据映射关系和分库路由配置,将原始OQL语句转换为各数据库查询的SQL语句,该分库路由配置为查询领域模型的对象位置的配置。
其中,分库路由配置是指查询领域模型中的对象保存在哪个数据库的配置。
具体地,计算机设备获取与原始OQL语句中的对象信息具有映射关系的领域模型中的对象信息,并根据分库路由配置查询领域模型中的对象的保存位置,将领域模型中的对象信息转换为SQL语句中对应的查询信息。
上述对象查询方法中,通过确定原始OQL语句中的对象信息,并将该对象信息映射到领域模型中,然后获取领域模型中具有映射关系的对象信息,根据分库路由配置查询领域模型中的对象的保存在哪个数据库,并将领域模型中具有映射关系的对象信息转换为相应的SQL查询语句,该SQL语句可能为多条,能够同时在多个数据库中查询对象。
在一个实施例中,确定原始OQL语句中的对象信息的步骤包括:分析原始OQL语句;确定原始OQL语句中的对象和对应的属性。
具体地,计算机设备获取该原始OQL语句后,需要对该OQL语句进行词法解析、语法解析和语义分析等,确定该OQL语句中需要查询的对象、查询该对象所涉及到的其它对象,还需要确定各个对象本身的属性和各对象之间的关联属性。将原始OQL语句中的对象信息进行拆分,以获取原始OQL语句中的对象和对象之间的关系。
比如,原始OQL语句如下:
select top 10title,author.name,author.birthday
from blog
where author.gender=‘男’
order by publishTime
得到该OQL语句后,计算机设备对该OQL进行词法、语义和语法解析,可知该OQL语句要查询的是:男性作者最近发布的前10篇博客的标题、作者姓名和作者生日,并且查询结果按博客发布的时间排序。该OQL语句中涉及的对象有:博客blog和作者author;对象之间的关联关系为:blog.author;该OQL语句中的where字句用于指定查询的条件为:作者的性别为男。计算机设备还可以对该OQL语句进行过滤,得到满足条件的数据,即该OQL语句中的条件为where字句指定的数据,则隐含的条件是指对象之间的关系,即blog.author。
在一个实施例中,如图3所示,将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系的步骤包括:
步骤302,将原始OQL语句中的根对象与领域模型中的聚合根实体建立映射关系。
其中,根对象是指OQL语句中需要查询的主体对象。聚合是指领域模型驱动设计中,一组关系紧密的业务对象集合,是领域模型的一组关系对象。聚合根是指领域对象进行自顶向下设计时,聚合的顶级业务对象。每个聚合都有一个根实体(聚合根,AggregateRoot),这个根实体是聚合所表述的领域概念的主体,外部对象需要访问聚合内的实体时,只能通过聚合根进行访问,而不能直接访问。
具体地,计算机设备获取原始OQL语句中的根对象,并根据该根对象在领域模型中调用对应的聚合根实体,将根对象和聚合根实体对象建立映射关系。
步骤304,将原始OQL语句中根对象的属性与领域模型中聚合根实体的属性建立映射关系。
具体地,计算机设备确定原始OQL语句中的根对象的属性,并查找领域模型中对应的聚合根实体的属性,建立两者的关于属性的映射关系。
步骤306,将原始OQL语句中的子对象与领域模型中的聚合根实体引用的实体对象建立映射关系。
其中,子对象是指与根对象具有关联关系的对象。聚合根实体引用的实体对象是指在一个聚合内要通过访问聚合根实体才能进行访问的对象。
具体地,计算机设备确定原始OQL语句中的子对象,并根据该子对象在领域模型中查找对应的聚合根实体引用的实体对象,将子对象和被引用的实体对象建立映射关系。
步骤308,将原始OQL语句中子对象的属性与领域模型中的聚合根实体引用的实体对象的属性建立映射关系。
具体地,计算机设备确定原始OQL语句中子对象所具有的属性,在领域模型中查找与该子对象对应的实体对象,并确定该实体对象具有的属性,将子对象所具有的属性与领域模型中的聚合根实体引用的实体对象具有的属性建立映射关系。通过将原始OQL语句中的对象信息进行细化,并将细化后的对象信息映射到领域模型中,以建立原始OQL语句中细化后的对象信息与领域模型的对应的对象信息之间的映射关系,使得该映射关系更清楚。
如图4所示,企业采购台式电脑,系统中记录采购订单,那么需要对采购订单进行建模:
采购订单也称为单据头,也是聚合根,包括:采购人、采购日期、总金额、审批人。分录用于记录具体的采购物品,如显示器、数量、单价、金额。其中,显示器会被列为“物料”的基础资料,记录详细的参数信息。审批人可能是多个,为“多选基础资料”。这些对象组成“采购订单”领域模型。
该“采购订单”领域模型中,聚合根实体为单据头,聚合根实体引用的实体对象包括分录、基础资料和多选基础资料,聚合根实体与其引用的实体对象之间的属性为单据头分别与分录、基础资料、多选基础资料三者之间的关联属性。
当计算机设备获取到原始OQL语句时,确定该原始OQL语句中的根对象、子对象和属性,如图4所示,将该原始OQL语句中的根对象映射到该“采购订单”领域模型中,则可以表示为单据头,子对象映射到该“采购订单”领域模型中,则可以表示为分录、基础资料和多选基础资料中的至少一种,原始OQL语句中的属性可以是根对象和子对象之间的关联属性,映射到该“采购订单”领域模型中,则可以表示为单据头与分录、基础资料、多选基础资料三种中的至少一种之间的关联属性。
在一个实施例中,将原始OQL语句中的子对象与领域模型中的聚合根实体引用的实体对象建立映射关系的步骤包括:将原始OQL语句中的不同子对象与领域模型中的聚合根实体引用的不同类型的实体对象分别建立对应的映射关系;将原始OQL语句中根对象对子对象的引用和领域模型中的聚合根实体对实体对象的引用建立映射关系。
具体地,领域模型中的聚合根实体引用的实体对象的类型可能有三种,分为分录、基础资料和多选基础资料。并且聚合根实体对这三种不同类型的实体对象的引用关系也可能是不相同的,例如,当聚合根实体引用实体对象是分录时,聚合根实体与分录的关系是1:n,即一个聚合根实体对应多个实体对象。当聚合根实体引用实体对象是基础资料时,聚合根实体与分录的关系是1:1,即一个聚合根实体对应一个实体对象。当聚合根实体引用实体对象是多选基础资料时,聚合根实体与多选基础资料的关系是n:n,即多个聚合根实体对应多个实体对象。原始OQL语句只有一个根对象,但是可能存在多个不同的子对象。计算机设备要确定原始OQL中的不同子对象在领域模型中分别对应哪些类型的实体对象,然后将根对象对不同子对象的引用,与对应的领域模型中聚合根实体对不同类型的实体对象的引用建立映射关系。通过建立原始OQL语句中的不同子对象与领域模型中的不同类型的实体对象的映射,并将原始OQL语句中根对象对子对象的引用映射到领域模型中的聚合根实体对实体对象的引用上,细化了原始OQL语句不同子对象间的关联关系,和根对象与不同子对象之间的引用关系,从而使得映射到领域模型中的不同类型的实体对象间的关联关系,和聚合根实体对不同类型的实体对象的引用关系更加明确。
在一个实施例中,将原始OQL语句中根对象对子对象的引用和领域模型中的聚合根实体对实体对象的引用建立映射关系的步骤包括:确定原始OQL语句中的主键和外键;将原始OQL语句中的主键和外键与领域模型中的主键和外键建立映射关系。
其中,主关键字(primary key,简称主键)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录。如果公共关键字在一个关系中是主键,那么这个公共关键字被称为另一个关系的外键,外键是相对于数据库设计中的参考完整性而言,它与主键之间是彼此依赖的关系。
具体地,计算机设备对原始OQL语句进行分析,确定该语句中的主键和外键。计算机设备不仅要确定原始OQL语句中根对象的主键和根对象在其它子对象中的外键,还要确定各子对象的主键和各子对象在根对象中的外键,以及需要确定各子对象在其它子对象中的外键等。然后在领域模型中查找与原始OQL语句中的主外键对应的聚合根实体和实体对象的主外键建立映射关系。通过将原始OQL语句中根对象和子对象的主外键映射到领域模型,以确定领域模型中的聚合根实体和实体对象的主外键,通过主键和外键进一步细化了原始OQL语句中对象信息,使得根对象对子对象的引用关系更清晰,从而使得映射到领域模型中的聚合根实体对实体对象的引用关系变得更细致、更清楚。
在一个实施例中,如图5所示,根据映射关系和分库路由配置,将原始OQL语句转换为各数据库查询的SQL语句,该分库路由配置为查询领域模型的对象位置的配置的步骤包括:
步骤502,根据分库路由配置和领域模型中的聚合根实体生成SQL语句中的主表。
步骤504,根据领域模型中聚合根实体的属性生成SQL语句中主表的列。
步骤506,根据分库路由配置和领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表。
步骤508,根据领域模型中的聚合根实体引用的实体对象的属性生成SQL语句中关联表的属性。
其中,主表是指在数据库中建立的表格,主表中存在主键,用于与其它表相关联,并且主键作为主表中的唯一性标识。关联表指两个数据库及其表之间的数据存在相互依赖和影响关系的表。比如,有一张学生表作为主表,包括学号、姓名和性别,还有一张成绩表作为关联表,包括学号、课程号和成绩,则学生表和成绩表通过学号进行关联。
具体地,计算机设备利用分库路由配置查询领域模型中的聚合根实体和该聚合根实体引用的实体对象保存在哪个数据库中,并将领域模型中的聚合根实体转换为SQL语句中对某个数据库中的主表的查询,将聚合根实体的属性转换为SQL语句中对该主表的列的查询,将聚合根实体引用的实体对象转换为SQL语句中对该主表的关联表的查询,聚合根实体引用的实体对象的属性转换为对SQL语句中对该主表的关联表的属性的查询,然后将这些查询语句组合成完整的SQL语句,实现了将原始OQL语句翻译为SQL语句的处理。
例如,有OQL语句:select author.name from blog where blog.title like?
该OQL语句需要查询blog对象下的author对象的name属性。
blog和author对象之间的引用关系为blog.author。
blog对象,对应的表为t_blog,包括:主键id、标题title、...作者authorId。
author对象,对应的表为t_author,包括主键id,name,birthday,genner...。
其中,作者authorId为表t_author在表t_blog中的外键。
将该OQL语句翻译为SQL语句,如下:
Select author.name
From t_blog blog
Left join t_author author on author.id=blog.authorId
Where blog.title like?
在一个实施例中,根据领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表的步骤之后,还包括:
根据领域模型中的聚合根实体对实体对象的引用确定SQL语句中的主键和外键;
当领域模型中的聚合根实体对实体对象的引用关系是多对多时,在SQL语句中创建新表以确定多个主表与多个关联表的关联关系。
具体地,计算机设备将领域模型中的聚合根实体对实体对象的引用转换为SQL语句中的主表和关联表所对应的主键和外键。当领域模型中的聚合根实体对实体对象的引用关系是多对多时,表示聚合根实体引用实体对象是多选基础资料,则表示该领域模型中存在多个聚合根实体,并且对应多个实体对象,该情况在SQL语句中则体现为多个主表对应多个关联表。此时要将聚合根实体对实体对象的引用转换为SQL语句,需要确定每个聚合根实体所对应的实体对象,即确定每个主表对应的关联表,则可以在SQL语句中创建一个新表以确定多个主表各自对应的关联表之间的关系。通过将领域模型中的聚合根实体对实体对象的引用转换为SQL语句中的主键和外键,以确定主表和关联表之间的关联关系。并在SQL语句中创建新表确定多个主表和多个关联表之间的关联关系,以实现将一条OQL语句转换为多条SQL语句的处理,使得计算机设备能够同时查询多个数据库中的对象。
在一个实施例中,如图6所示,该对象查询方法包括:
步骤602,获取原始OQL语句,分析原始OQL语句,确定原始OQL语句中的对象和对应的属性。
步骤604,将原始OQL语句中的根对象与领域模型中的聚合根实体建立映射关系。
步骤606,将原始OQL语句中根对象的属性与领域模型中聚合根实体的属性建立映射关系。
步骤608,将原始OQL语句中的不同子对象与领域模型中的聚合根实体引用的不同类型的实体对象分别建立对应的映射关系。
步骤610,确定原始OQL语句中的主键和外键。
步骤612,将原始OQL语句中的主键和外键与领域模型中的主键和外键建立映射关系。
步骤614,将原始OQL语句中子对象的属性与领域模型中的聚合根实体引用的实体对象的属性建立映射关系。
步骤616,根据分库路由配置和领域模型中的聚合根实体生成SQL语句中的主表。
步骤618,根据领域模型中聚合根实体的属性生成SQL语句中主表的列。
步骤620,根据分库路由配置和领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表。
步骤622,根据领域模型中的聚合根实体对实体对象的引用确定SQL语句中的主键和外键。
步骤624,当领域模型中的聚合根实体对实体对象的引用关系是多对多时,在SQL语句中创建新表以确定多个主表与多个关联表的关联关系。
步骤626,根据领域模型中的聚合根实体引用的实体对象的属性生成SQL语句中关联表的属性。
上述对象查询方法,通过解析原始OQL语句以确定对象信息,并将原始OQL语句中的对象信息与领域模型中的对象信息建立映射,并一步步细化原始OQL语句中的对象信息,使得领域模型中的对象信息也相应地被逐步细化,从而使得两者之间建立的映射关系更细致更清晰,便于计算机设备利用分库路由配置根据两者之间建立的映射关系查找到领域模型中的对象的保存在哪个数据库中,并将原始OQL语句转换为从各数据库中查询对象的多条SQL语句,实现同时在多个数据库中查询对象的功能。
如图7所示,有OQL语句如下:
select bizdate,billno,org.number,
entries.debitlocal,entries.currency.number
from gl_voucher
where entries.currency.name=‘人民币’
需要查询凭证的数据,凭证g_voucher为聚合根,包括组织(org)、分录(entries)和币别(entires.currency)。
解析该OQL语句可知,根对象为gl_voucher,子对象包括bizdate、billno、org、entries和entries.currency。从entries.currency.number可知,entries.currency是entries的直接引用对象,该OQL语句需要查询在entries中的币别为人民币的对象。将该OQL语句映射到领域模型中,可得到两者的映射关系。即聚合根实体为凭证,凭证的实体名称为g_voucher,该聚合根实体引用的实体对象有组织、分录和币别。组织的实体名称为bos_org,与凭证g_voucher的关联关系为id=g_voucher.org。分录的实体名称为entries,与凭证g_voucher的关联关系为id=g_voucher.entries。币别的实体名称为bos_currency,与分录的关联关系为id=entries.currency。并将该领域模型中的对象分库,并根据分库路由生成分库SQL语句。其中,凭证的分库路由=gl,组织的分库路由=basedata,分录的分库路由=gl,币别的分库路由=basedata。
其中,分库路由标识就是数据库的标识,分库路由可以根据数据库的标识查找到对应的数据库。每个分库路由标识对应一个数据库。当指向同一个物理数据库时,也可能多个路由标识共用一个数据库。根据查询对象与领域模型的映射关系,以及领域实体的分库信息,该OQL语句可以生成分库SQL。比如,可以生成三条SQL语句从两个数据库gl和basedata中查询。生成的SQL语句如下:
1)查询对象entries.currency。
--sql@basedata
SELECT E.fnumber"entries.currency.number",E.FId"INNER_id"
FROM T_BD_Currency E
LEFT JOIN T_BD_Currency_L B ON B.FId=E.FId AND B.FLocaleId='zh_CN'
WHERE B.fname=?
人民币
2)查询对象gl_voucher即聚合根(main)。翻译成SQL语句如下:
--sql@gl
SELECT A.Fbizdate"bizdate",A.fnumber"billno",D.FLOCALDEBIT"entries.debitlocal",A.forgid"INNER_org",D.FCURRENCYID"INNER_entries_currency"
FROM T_GL_VOUCHER A
LEFT JOIN T_GL_VOUCHERENTRY D ON D.FId=A.FId
WHERE D.FCURRENCYID=?
1
3)查询对象org。翻译成SQL语句如下:
--sql@basedata
SELECT C.FNumber"org.number",C.FId"INNER_id"
FROM t_ORG_ORG C
WHERE C.FId in(?,?,?,?)
100001,437338588649112576,437338339062858752,100316
最后,可通过查询引擎将多库数据合并:
#HashJoin(inner join):
main#inner_entries_currency=entries.currency#inner_id
#HashJoin(left join):
main#inner_org=org#inner_id
得到合并的数据如下:
bizdate | billno | org.number | entries.debitlocal | entries.currency.number |
2018-06-30 | 112233012018060021 | 11223301 | 1.000000 | CNY |
2018-06-30 | 112233012018060021 | 11223301 | 0.000000 | CNY |
2018-08-27 | 112233022018080023 | 11223302 | 8.000000 | CNY |
2018-08-27 | 112233022018080023 | 11223302 | 0.000000 | CNY |
2018-08-27 | 100316 2018080030 | 100316 | 36.000000 | CNY |
2018-08-27 | 100316 2018080030 | 100316 | 0.000000 | CNY |
2018-08-27 | 100316 2018080036 | 100316 | 11.000000 | CNY |
2018-08-28 | 100316 2018080044 | 100316 | 10.000000 | CNY |
其中,bizdate表示日期,billno表示账单的编号,org.number表示组织的编号,entries.debitlocal表示借方的数目,entries.currency.number表示币别。
应该理解的是,虽然图1-7的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-7中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图8所示,提供了一种对象查询装置,包括:确定模块802、映射模块804和生成模块806,其中:
确定模块802,用于获取原始OQL语句,确定原始OQL语句中的对象信息。
映射模块804,用于将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系。
生成模块806,用于根据映射关系和分库路由配置,将原始OQL语句转换为各数据库查询的SQL语句,该分库路由配置为查询领域模型的对象位置的配置。
上述对象查询装置,通过将原始OQL语句中的对象信息与领域模型的对象信息建立映射关系,根据该映射关系将原始OQL语句转换成多条SQL语句,能够实现同时在多个数据库中查询对象。
在一个实施例中,确定模块802还用于:分析原始OQL语句;确定原始OQL语句中的对象和对应的属性。通过拆分原始OQL语句中的对象信息,以获取原始OQL语句中的对象和对象之间的关系。
在一个实施例中,映射模块804还用于:将原始OQL语句中的根对象与领域模型中的聚合根实体建立映射关系;将原始OQL语句中根对象的属性与领域模型中聚合根实体的属性建立映射关系;将原始OQL语句中的子对象与领域模型中的聚合根实体引用的实体对象建立映射关系;将原始OQL语句中子对象的属性与领域模型中的聚合根实体引用的实体对象的属性建立映射关系。通过将原始OQL语句中的对象信息进行细化,并将细化后的对象信息映射到领域模型中,以建立原始OQL语句中细化后的对象信息与领域模型的对应的对象信息之间的映射关系,使得该映射关系更清楚。
在一个实施例中,映射模块804还用于:将原始OQL语句中的不同子对象与领域模型中的聚合根实体引用的不同类型的实体对象分别建立对应的映射关系;将原始OQL语句中根对象对子对象的引用和领域模型中的聚合根实体对实体对象的引用建立映射关系。通过建立原始OQL语句中的不同子对象与领域模型中的不同类型的实体对象的映射,并将原始OQL语句中根对象对子对象的引用映射到领域模型中的聚合根实体对实体对象的引用上,细化了原始OQL语句不同子对象间的关联关系,和根对象与不同子对象之间的引用关系,从而使得映射到领域模型中的不同类型的实体对象间的关联关系,和聚合根实体对不同类型的实体对象的引用关系更加明确。
在一个实施例中,映射模块804还用于:确定原始OQL语句中的主键和外键;将原始OQL语句中的主键和外键与领域模型中的主键和外键建立映射关系。通过确定主键和外键进一步细化了原始OQL语句中对象信息,使得根对象对子对象的引用关系更清晰,从而使得映射到领域模型中的聚合根实体对实体对象的引用关系变得更细致、更清楚。
在一个实施例中,转换模块806还用于:根据分库路由配置和领域模型中的聚合根实体生成SQL语句中的主表;根据领域模型中聚合根实体的属性生成SQL语句中主表的列;根据分库路由配置和领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表;根据领域模型中的聚合根实体引用的实体对象的属性生成SQL语句中关联表的属性。将领域模型中的对象信息转换为SQL语句中相应的对象的查询信息,然后将这些查询语句组合成完整的SQL语句,实现了将原始OQL语句翻译为SQL语句的处理。
在一个实施例中,转换模块806还用于:根据领域模型中的聚合根实体对实体对象的引用确定SQL语句中的主键和外键;当领域模型中的聚合根实体对实体对象的引用关系是多对多时,在SQL语句中创建新表以确定多个主表与多个关联表的关联关系。通过将领域模型中的聚合根实体对实体对象的引用转换为SQL语句中的主键和外键,以确定主表和关联表之间的关联关系。并在SQL语句中创建新表确定多个主表和多个关联表之间的关联关系,以实现将一条OQL语句转换为多条SQL语句的处理,使得计算机设备能够同时查询多个数据库中的对象。
关于对象查询装置的具体限定可以参见上文中对于对象查询方法的限定,在此不再赘述。上述对象查询装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图9所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储与对象相关的数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种对象查询方法。
本领域技术人员可以理解,图9中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述对象查询方法的步骤。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述对象查询方法的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种对象查询方法,所述方法包括:
获取原始OQL语句,确定所述原始OQL语句中的对象信息;
将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系;
根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置。
2.根据权利要求1所述的方法,其特征在于,所述确定所述原始OQL语句中的对象信息的步骤包括:
分析所述原始OQL语句;
确定所述原始OQL语句中的对象和对应的属性。
3.根据权利要求1所述的方法,其特征在于,所述将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系的步骤包括:
将所述原始OQL语句中的根对象与领域模型中的聚合根实体建立映射关系;
将所述原始OQL语句中根对象的属性与所述领域模型中聚合根实体的属性建立映射关系;
将所述原始OQL语句中的子对象与所述领域模型中的聚合根实体引用的实体对象建立映射关系;
将所述原始OQL语句中子对象的属性与所述领域模型中的聚合根实体引用的实体对象的属性建立映射关系。
4.根据权利要求3所述的方法,其特征在于,所述将所述原始OQL语句中的子对象与所述领域模型中的聚合根实体引用的实体对象建立映射关系的步骤包括:
将所述原始OQL语句中的不同子对象与所述领域模型中的聚合根实体引用的不同类型的实体对象分别建立对应的映射关系;
将所述原始OQL语句中根对象对子对象的引用和所述领域模型中的聚合根实体对实体对象的引用建立映射关系。
5.根据权利要求4所述的方法,其特征在于,所述将所述原始OQL语句中根对象对子对象的引用和所述领域模型中的聚合根实体对实体对象的引用建立映射关系的步骤包括:
确定所述原始OQL语句中的主键和外键;
将所述原始OQL语句中的主键和外键与所述领域模型中的主键和外键建立映射关系。
6.根据权利要求1所述的方法,其特征在于,所述根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置的步骤包括:
根据分库路由配置和所述领域模型中的聚合根实体生成SQL语句中的主表;
根据所述领域模型中聚合根实体的属性生成SQL语句中主表的列;
根据所述分库路由配置和所述领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表;
根据所述领域模型中的聚合根实体引用的实体对象的属性生成SQL语句中关联表的属性。
7.根据权利要求6所述的方法,其特征在于,所述根据所述领域模型中的聚合根实体引用的实体对象生成SQL语句中关联表的步骤之后,还包括:
根据所述领域模型中的聚合根实体对实体对象的引用确定SQL语句中的主键和外键;
当所述领域模型中的聚合根实体对实体对象的引用关系是多对多时,在SQL语句中创建新表以确定多个主表与多个关联表的关联关系。
8.一种对象查询装置,其特征在于,所述装置包括:
确定模块,用于获取原始OQL语句,确定所述原始OQL语句中的对象信息;
映射模块,用于将所述原始OQL语句中的对象信息与领域模型的对象信息建立映射关系;
生成模块,用于根据所述映射关系和分库路由配置,将所述原始OQL语句转换为各数据库查询的SQL语句,所述分库路由配置为查询所述领域模型的对象位置的配置。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811330726.6A CN109669951B (zh) | 2018-11-09 | 2018-11-09 | 对象查询方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811330726.6A CN109669951B (zh) | 2018-11-09 | 2018-11-09 | 对象查询方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109669951A true CN109669951A (zh) | 2019-04-23 |
CN109669951B CN109669951B (zh) | 2020-12-04 |
Family
ID=66142035
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811330726.6A Active CN109669951B (zh) | 2018-11-09 | 2018-11-09 | 对象查询方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109669951B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110633331A (zh) * | 2019-09-12 | 2019-12-31 | 金蝶蝶金云计算有限公司 | 一种关系数据库中数据提取方法、系统及相关设备 |
CN111797073A (zh) * | 2019-11-26 | 2020-10-20 | 北京京东尚科信息技术有限公司 | 数据库管理方法、电子设备与计算机可读存储介质 |
CN111966704A (zh) * | 2020-07-09 | 2020-11-20 | 杭州传化智能制造科技有限公司 | Orm框架实现方法、系统、计算机设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101021875A (zh) * | 2007-03-22 | 2007-08-22 | 金蝶软件(中国)有限公司 | 面向对象的数据库访问方法及系统 |
CN101582079A (zh) * | 2009-06-23 | 2009-11-18 | 用友软件股份有限公司 | 一种对象查询方法和装置 |
CN106055587A (zh) * | 2016-05-21 | 2016-10-26 | 乐视控股(北京)有限公司 | 一种分库数据库系统及其路由方法 |
CN106844693A (zh) * | 2017-01-24 | 2017-06-13 | 浙江大学 | 一种openEHR Template到关系数据库的转换方法 |
-
2018
- 2018-11-09 CN CN201811330726.6A patent/CN109669951B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101021875A (zh) * | 2007-03-22 | 2007-08-22 | 金蝶软件(中国)有限公司 | 面向对象的数据库访问方法及系统 |
CN101582079A (zh) * | 2009-06-23 | 2009-11-18 | 用友软件股份有限公司 | 一种对象查询方法和装置 |
CN106055587A (zh) * | 2016-05-21 | 2016-10-26 | 乐视控股(北京)有限公司 | 一种分库数据库系统及其路由方法 |
CN106844693A (zh) * | 2017-01-24 | 2017-06-13 | 浙江大学 | 一种openEHR Template到关系数据库的转换方法 |
Non-Patent Citations (1)
Title |
---|
潘建南: "JVM对象查询语言(OQL)", 《CSDN》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110633331A (zh) * | 2019-09-12 | 2019-12-31 | 金蝶蝶金云计算有限公司 | 一种关系数据库中数据提取方法、系统及相关设备 |
CN110633331B (zh) * | 2019-09-12 | 2022-08-23 | 金蝶蝶金云计算有限公司 | 一种关系数据库中数据提取方法、系统及相关设备 |
CN111797073A (zh) * | 2019-11-26 | 2020-10-20 | 北京京东尚科信息技术有限公司 | 数据库管理方法、电子设备与计算机可读存储介质 |
CN111966704A (zh) * | 2020-07-09 | 2020-11-20 | 杭州传化智能制造科技有限公司 | Orm框架实现方法、系统、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109669951B (zh) | 2020-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8380750B2 (en) | Searching and displaying data objects residing in data management systems | |
CN105183735B (zh) | 数据的查询方法及查询装置 | |
US10747762B2 (en) | Automatic generation of sub-queries | |
US5895465A (en) | Heuristic co-identification of objects across heterogeneous information sources | |
US8200684B2 (en) | Method and system for dynamic templatized query language in software | |
CN100550019C (zh) | 面向对象的数据库访问方法及系统 | |
US6282537B1 (en) | Query and retrieving semi-structured data from heterogeneous sources by translating structured queries | |
US11042662B2 (en) | Data aggregation system for enabling query operations on restricted data that originates from multiple independent multiple sources | |
CN104765731B (zh) | 数据库查询优化方法和设备 | |
US8868595B2 (en) | Enhanced control to users to populate a cache in a database system | |
CN110263317B (zh) | 一种生成文档模板的方法及装置 | |
RU2005127536A (ru) | Система, способ и интерфейс для обеспечения персонализированного поиска и доступа к информации | |
CN109669951A (zh) | 对象查询方法、装置、计算机设备和存储介质 | |
US20210081436A1 (en) | Classifying different query types | |
US20040111416A1 (en) | System and method for communicating data to a process | |
US9069882B2 (en) | Mapping and boosting of terms in a format independent data retrieval query | |
US20240193293A1 (en) | Data aggregation system for enabling query operations on restricted data that originates from multiple independent multiple sources | |
US11615089B1 (en) | System, method, and computer program for converting a natural language query to a structured database query | |
CN111639095B (zh) | 一种数据表查询方法、装置及存储介质 | |
US7627553B1 (en) | Custom queries for segmentation | |
Suciu et al. | Cloud computing and big data as convergent technologies for retail pricing strategies of SMEs | |
Ottinger et al. | Batch Processing and Native SQL | |
CN113918634A (zh) | 一种用于数据交互的数据适配方法、适配器及存储介质 | |
CN114398601A (zh) | 身份管控方法及装置 | |
CN108572998A (zh) | 一种针对电子卡片数据的数据查找方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |