首页> 中国专利> 基于元数据的数据库动态查询系统和数据库动态查询方法

基于元数据的数据库动态查询系统和数据库动态查询方法

摘要

本发明提供了一种基于元数据的数据库动态查询系统,包括:表达式获取单元,用于获取语言集成查询的表达式;表达式解析单元,用于根据所述语言集成查询的表达式遵循的语言集成查询标准、以及实体或业务对象的元数据信息,对所述语言集成查询的表达式进行解析,以生成相应的SQL查询语句;查询单元,用于执行所述SQL查询语句,以从数据库获取并返回相应的查询结果。相应地,本发明还提出了一种基于元数据的数据库动态查询方法。通过本发明的技术方案,无需在系统开发前期预置查询方案,也无需调用特定参数接口,即可实现复杂的SQL查询运用,增加了动态查询的灵活性,同时使得弱类型的业务对象和实体,具有面向对象的查询。

著录项

  • 公开/公告号CN102799644A

    专利类型发明专利

  • 公开/公告日2012-11-28

    原文格式PDF

  • 申请/专利权人 用友软件股份有限公司;

    申请/专利号CN201210222583.3

  • 发明设计人 杨胜;

    申请日2012-06-28

  • 分类号G06F17/30(20060101);

  • 代理机构北京友联知识产权代理事务所(普通合伙);

  • 代理人尚志峰;汪海屏

  • 地址 100094 北京市海淀区北清路68号用友软件园

  • 入库时间 2023-12-18 07:26:32

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-02-24

    专利权的转移 IPC(主分类):G06F17/30 登记生效日:20160202 变更前: 变更后: 申请日:20120628

    专利申请权、专利权的转移

  • 2015-09-23

    授权

    授权

  • 2013-01-23

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20120628

    实质审查的生效

  • 2012-11-28

    公开

    公开

说明书

技术领域

本发明涉及计算机技术领域,具体而言,涉及一种基于元数据的数据 库动态查询系统和数据库动态查询方法。

背景技术

在业务应用系统中,特别在实现复杂的数据处理业务中,业务数据的 查询操作是常用且频繁的,一般的开发手段通常是通过硬编码SQL查询 来实现,这样使得产品极不易维护且查询语句难以得到复用。

在相关技术中,还提供了依据用户指定的信息,从预置的多个元数据 中查找相对应的元数据:其包括查询的字段的描述,过滤条件的描述,排 序字段的描述,以及关于查询子对象的描述,生成查询对象;在通过调用 参数接口,以及实际需求修改查询字段,过滤条件,排序条件极其查询子 对象及其参数信息,生成SQL查询,执行后,返回对应的数据集。

但这种处理方式具有一定得局限性,其表现在:1.只有在开发前期预 置相对应的查询方案,再根据预置的查询方案做局部性修改,改造成适合 特定查询方案,才能实现动态的数据库查询。2.通过调用特定参数接口, 对预置的查询方案进行修改,如果不对参数接口的扩展,就会制约复杂的 SQL查询运用和动态查询的灵活性。

因此,需要一种新的数据库动态查询方法,无需在系统开发前期预置 查询方案,也无需调用特定参数接口,即可实现复杂的SQL查询运用, 增加了动态查询的灵活性,同时使得弱类型的业务对象和实体,具有面向 对象的查询。

发明内容

本发明正是基于上述问题,提出了一种新的数据库动态查询方法,无 需在系统开发前期预置查询方案,也无需调用特定参数接口,即可实现复 杂的SQL查询运用,增加了动态查询的灵活性,同时使得弱类型的业务 对象和实体,具有面向对象的查询。

有鉴于此,本发明提出了一种基于元数据的数据库动态查询系统,包 括:表达式获取单元,用于获取语言集成查询的表达式;表达式解析单 元,用于根据所述语言集成查询的表达式遵循的语言集成查询标准、以及 实体或业务对象的元数据信息,对所述语言集成查询的表达式进行解析, 以生成相应的SQL查询语句;查询单元,用于执行所述SQL查询语句, 以从数据库获取并返回相应的查询结果。在该技术方案中,通过语言集成 查询的表达式转换,得到SQL查询语句,实现数据库的动态查询。

在上述技术方案中,优选地,所述表达式获取单元包括:第一表达式 生成子单元,用于根据预设的语言集成查询标准生成所述语言集成查询的 表达式;或语义定义子单元、第二表达式生成子单元和表达式转换子单 元,其中,所述语义定义子单元用于定义表达式生成规范,所述第二表达 式生成子单元用于根据所述表达式生成规范生成字符类型的表达式,所述 表达式转换子单元用于将所述字符类型的表达式转换为所述语言集成查询 的表达式。在该技术方案中,通过对表达式生成规范的定义,从而使得生 成的字符类型的表达式能够被转换为语言集成查询的表达式。

在上述技术方案中,优选地,所述表达式转换子单元包括:信息获取 模块,用于通过切分所述字符类型的表达式,以获取其中的信息,所述信 息包括条件列;类型获取模块,用于根据所述实体或业务对象的元数据信 息,获取所述条件列真实的物理类型;转换处理模块,用于根据所述信息 和所述物理类型将所述字符类型的表达式装配成所述语言集成查询的表达 式。在该技术方案中,将元数据信息引入生成的表达式,从而实现对相应 数据的查询。

在上述技术方案中,优选地,所述表达式解析单元包括:属性信息获 取子单元,用于通过构建所述语言集成查询的表达式的目录树访问器,以 获取所述语言集成查询的表达式的属性信息;查询语句生成子单元,用于 根据所述属性信息及所述实体或业务对象的元数据信息装配成SQL构造 器,以生成所述SQL查询语句。在该技术方案中,能够生成相应的SQL 查询语句,而不需要预置数据或调用特定参数接口。

在上述技术方案中,优选地,所述表达式解析单元还包括:语句优化 子单元,用于通过所述SQL构造器对生成的SQL查询语句进行优化处 理。在该技术方案中,通过对SQL语句进行优化,使得查询过程更为快 速、节省资源。

根据本发明的又一方面,还提出了一种基于元数据的数据库动态查询 方法,包括:步骤202,获取语言集成查询的表达式;步骤204,根据所 述语言集成查询的表达式遵循的语言集成查询标准、以及实体或业务对象 的元数据信息,对所述语言集成查询的表达式进行解析,以生成相应的 SQL查询语句;步骤206,执行所述SQL查询语句,以从数据库获取并 返回相应的查询结果。在该技术方案中,通过语言集成查询的表达式转 换,得到SQL查询语句,实现数据库的动态查询。

在上述技术方案中,优选地,所述步骤202包括:根据预设的语言集 成查询标准生成所述语言集成查询的表达式;或定义表达式生成规范,根 据所述表达式生成规范生成字符类型的表达式,并将所述字符类型的表达 式转换为所述语言集成查询的表达式。在该技术方案中,通过对表达式生 成规范的定义,从而使得生成的字符类型的表达式能够被转换为语言集成 查询的表达式。

在上述技术方案中,优选地,将所述字符类型的表达式转换为所述语 言集成查询的表达式的过程包括:切分所述字符类型的表达式,以获取其 中的信息,所述信息包括条件列;根据所述实体或业务对象的元数据信 息,获取所述条件列真实的物理类型,从而根据所述信息和所述物理类型 将所述字符类型的表达式装配成所述语言集成查询的表达式。在该技术方 案中,将元数据信息引入生成的表达式,从而实现对相应数据的查询。

在上述技术方案中,优选地,在所述步骤204中,对所述语言集成查 询的表达式进行解析的过程包括:构建所述语言集成查询的表达式的目录 树访问器,以获取所述语言集成查询的表达式的属性信息;根据所述属性 信息及所述实体或业务对象的元数据信息装配成SQL构造器,以生成所 述SQL查询语句。在该技术方案中,能够生成相应的SQL查询语句,而 不需要预置数据或调用特定参数接口。

在上述技术方案中,优选地,所述步骤204还包括:所述SQL构造 器对生成的SQL查询语句进行优化处理。在该技术方案中,通过对SQL 语句进行优化,使得查询过程更为快速、节省资源。

通过以上技术方案,无需在系统开发前期预置查询方案,也无需调用 特定参数接口,即可实现复杂的SQL查询运用,增加了动态查询的灵活 性,同时使得弱类型的业务对象和实体,具有面向对象的查询。

附图说明

图1示出了根据本发明的实施例的基于元数据的数据库动态查询系统 的框图;

图2示出了根据本发明的实施例的基于元数据的数据库动态查询方法 的流程图;

图3示出了根据本发明的实施例的表达式目录树的访问时序图;

图4示出了根据本发明的实施例的表达式目录树的解析图。

具体实施方式

为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附 图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不 冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是, 本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明 的保护范围并不受下面公开的具体实施例的限制。

图1示出了根据本发明的实施例的基于元数据的数据库动态查询系统 的框图。

如图1所示,根据本发明的实施例的基于元数据的数据库动态查询系 统100,包括:表达式获取单元102,用于获取语言集成查询的表达式; 表达式解析单元104,用于根据语言集成查询的表达式遵循的语言集成查 询标准、以及实体或业务对象的元数据信息,对语言集成查询的表达式进 行解析,以生成相应的SQL查询语句;查询单元106,用于执行SQL查 询语句,以从数据库获取并返回相应的查询结果。在该技术方案中,通过 语言集成查询的表达式转换,得到SQL查询语句,实现数据库的动态查 询。

在上述技术方案中,优选地,表达式获取单元102包括:第一表达式 生成子单元1020,用于根据预设的语言集成查询标准生成语言集成查询 的表达式;或语义定义子单元1021、第二表达式生成子单元1022和表达 式转换子单元1024,其中,语义定义子单元1021用于定义表达式生成规 范,第二表达式生成子单元1022用于根据表达式生成规范生成字符类型 的表达式,表达式转换子单元1024用于将字符类型的表达式转换为语言 集成查询的表达式。在该技术方案中,通过对表达式生成规范的定义,从 而使得生成的字符类型的表达式能够被转换为语言集成查询的表达式。

在上述技术方案中,优选地,表达式转换子单元1024包括:信息获 取模块1024A,用于通过切分字符类型的表达式,以获取其中的信息,该 信息包括条件列;类型获取模块1024B,用于根据实体或业务对象的元数 据信息,获取条件列真实的物理类型;转换处理模块1024C,用于根据信 息和物理类型将字符类型的表达式装配成语言集成查询的表达式。在该技 术方案中,将元数据信息引入生成的表达式,从而实现对相应数据的查 询。

在上述技术方案中,优选地,表达式解析单元104包括:属性信息获 取子单元1040,用于通过构建语言集成查询的表达式的目录树访问器, 以获取语言集成查询的表达式的属性信息;查询语句生成子单元1042, 用于根据属性信息及实体或业务对象的元数据信息装配成SQL构造器, 以生成SQL查询语句。在该技术方案中,能够生成相应的SQL查询语 句,而不需要预置数据或调用特定参数接口。

在上述技术方案中,优选地,表达式解析单元104还包括:语句优化 子单元1044,用于通过SQL构造器对生成的SQL查询语句进行优化处 理。在该技术方案中,通过对SQL语句进行优化,使得查询过程更为快 速、节省资源。

图2示出了根据本发明的实施例的基于元数据的数据库动态查询方法 的流程图。

如图2所示,根据本发明的实施例的基于元数据的数据库动态查询方 法,包括:步骤202,获取语言集成查询的表达式;步骤204,根据语言 集成查询的表达式遵循的语言集成查询标准、以及实体或业务对象的元数 据信息,对语言集成查询的表达式进行解析,以生成相应的SQL查询语 句;步骤206,执行SQL查询语句,以从数据库获取并返回相应的查询结 果。在该技术方案中,通过语言集成查询的表达式转换,得到SQL查询 语句,实现数据库的动态查询。

在上述技术方案中,优选地,步骤202包括:根据预设的语言集成查 询标准生成语言集成查询的表达式;或定义表达式生成规范,根据表达式 生成规范生成字符类型的表达式,并将字符类型的表达式转换为语言集成 查询的表达式。在该技术方案中,通过对表达式生成规范的定义,从而使 得生成的字符类型的表达式能够被转换为语言集成查询的表达式。

在上述技术方案中,优选地,将字符类型的表达式转换为语言集成查 询的表达式的过程包括:切分字符类型的表达式,以获取其中的信息,该 信息包括条件列;根据实体或业务对象的元数据信息,获取条件列真实的 物理类型,从而根据信息和物理类型将字符类型的表达式装配成语言集成 查询的表达式。在该技术方案中,将元数据信息引入生成的表达式,从而 实现对相应数据的查询。

在上述技术方案中,优选地,在步骤204中,对语言集成查询的表达 式进行解析的过程包括:构建语言集成查询的表达式的目录树访问器,以 获取语言集成查询的表达式的属性信息;根据属性信息及实体或业务对象 的元数据信息装配成SQL构造器,以生成SQL查询语句。在该技术方案 中,能够生成相应的SQL查询语句,而不需要预置数据或调用特定参数 接口。

在上述技术方案中,优选地,步骤204还包括:SQL构造器对生成的 SQL查询语句进行优化处理。在该技术方案中,通过对SQL语句进行优 化,使得查询过程更为快速、节省资源。

下面结合图3和图4,对基于本发明的技术方案进行详细说明,其 中,图3示出了根据本发明的实施例的表达式目录树的访问时序图;图4 示出了根据本发明的实施例的表达式目录树的解析图。

本发明依赖基础的实体和业务对象元数据信息,遵从微软指定的语言 集成查询的语言规范或用户自定义的语言规范,通过动态解析语言装配成 集成查询表达式,然后通过表达式目录树访问器获取查询的各个元件,又 根据基础的元数据信息,来装配SQL构造器,最后通过SQL构造器编译 生成SQL查询语句,最后在最终的数据源(如SQL,oracle,XML文件等) 进行查询。通过该发明方案可以来实现各种复杂和灵活多变的查询,满足 纷繁复杂的查询需求;提高了基础元数据的利用率,从而让程序的维护简 易化,提高了动态查询机制的灵活性;统一集中对生成SQL语句进行性 能检测,分步优化,从而使SQL语句的执行效率提高。

这里涉及到根据定义的语言规范将字符串生成为表达式 (String2Expression)的过程,这里的语言规范可以采用多种方式,比如一种 方式下,可以按操作符分类定义的规范:

LinqToQeProvider<IBizDataRow>BizRows=

new LinqToQeProvider<IBizDataRow>("BoMetaID",PoLine.EntityKey, QueryType.Bo DynamicQuery);

参数说明:No61为业务对象的元数据编码;PoLine.EntityKey为业务 实体的元数据编码;QueryType.BoDynamicQuery为指定查询类型为业务 对象的动态查询。

具体地,可以分为一元运算符、二元运算符、三元运算符等,如:

一元运算符:

!取反运算符

字符串条件="!(name==0)";

数组参数集合={″test"};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

二元运算符:

==相等运算符

字符串条件="name==0";

数组参数集合={″test"};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

!=不相等运算符

字符串条件="name!=0";

数组参数集合={″test"};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

<=大于等于运算符

字符串条件="money<=0";

数组参数集合={100};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

<大于运算符

字符串条件="money<0";

数组参数集合={100};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

>小于运算符

字符串条件="money>0";

数组参数集合={100};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

||或运算符

字符串条件="(docType==0)||(docType==1)";

数组参数集合={“到货单”,”收货单”};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

&&与运算符

字符串条件="(docType==0)||(docType==1)";

数组参数集合={“到货单”,”收货单”};

查询结果集=查询业务对象.过滤(转换器<查询结果对象类型,布尔 值类型>(条件,参数));

三元运算符:

?:不支持

另一种方式,可以按内置函数定义的规范:

模糊配合函数:$Like

数组参数集合={″test%"};

字符串条件="$Like(colentity,0)";

包含函数:$IN

数组参数集合={″('test 1','test 2')"};

字符串条件="$In(name,1)";

内置函数的混合规范

数组参数集合={"mm%","('test 1','test 2')"};

字符串条件="($Like(colentity,0)&&$In(name,1))";

使用以上所定义的规范(仅为举例,本文没提到的规范并不意味着为 没做定义),可灵活地实现各种组合的查询。

从技术原理上说,字符类型的条件表达式,通过DynamicExpression 类的ParseLambda<T,S>(string expression,params object[]values)方法,来 切分出操作符、条件列、值等信息,在再根据基础的元数据信息,获取条 件列真实的物理类型,从而再装配成语言集成的查询表达式。

示例:按客户名称查询客户档案记录:

其查询构造表达式:

而语言集成查询的表达式,其是依赖于某一具体实体或业务对象进行 的动态查询,具体如下:

应用场景:应用开发当中,将面向过程查询转换成面向对象的查询, 使得查询书写更灵活,能兼容到特点环境中的内置函数(如C#字符串的长 度属性和Contain()方法)等。

技术原理:构建表达式目录树访问器,获取结果列、条件表达式树的 内容(操作符、条件列、值)、分组列,排序列,having列,条件表达式树 与根据基础的元数据信息一起决定装配条件部分。从对应的实体或业务对 象中,获取查询查询表名和查询级联关系。通过数据查询引擎,按结果列, 条件部分,排序列,分组列,having列,分页设置等装配成SQL构造 器,由SQL构造器编译生成优化处理后的SQL语句,最终由SQL执行器 执行返回查询结果集。

实现表达式目录树访问器

public abstract class目录树访问器

{

protected目录树访问器构造函数()

{}

protected virtual表达式表达式遍历函数(表达式类表达式)

{

if(==null)

return表达式;

switch(表达式.表达式运算符)

{

case表达式类型枚举.非运算:

case表达式类型枚举.不等于:

case表达式类型枚举.等于:

case表达式类型枚举.大于:

case表达式类型枚举.大于等于:

case表达式类型枚举.小于:

case表达式类型枚举.小于等于:

case表达式类型枚举.与运算:

case表达式类型枚举.与运算:

return this.二元表达式遍历函数((二元表达式类)表 达式);

.

.

case表达式类型枚举.类型转换:

case表达式类型枚举.调用委托:

return this.调用委托函数表达式((调用表达式)表达 式);

case表达式类型枚举.成员表达式:

return this.调用构造函数并初始化表达式((调用构 造函数)表达式);

default:

throw new异常(没定义和处理的表达式类型,表 达式.枚举项));

}

}

.

.

.

Protected  Virtual表达式二元表达式遍历函数(二元表达式表达式);

{

自身逻辑处理代码:构造SQL条件表达二叉树

Return基类.表达式遍历函数(表达式);

}

下面以一示例进行说明:

示例:业务对象的动态查询(按单据的创建日期查询单据记录)

LinqToQeProvider<IBizDataRow>BizRows=

new  LinqToQeProvider<IBizDataRow>("No61″,PoLine.EntityKey, QueryType.Bo DynamicQuery);

参数说明:No61为业务对象的元数据编码;

PoLine.EntityKey为业务实体的元数据编码;

QueryType.BoDynamicQuery为指定查询类型为业务对象的动态 查询。

另外,本方案通过构造SQL构造器,从而生成SQL语句并对SQL语 句进行尽可能地优化,具体地,按结果列、条件部分、排序列、分组列、 having列、分页设置等装配成SQL构造器后,由SQL构造器编译生成 SQL语句,并最大限度对SQL语句的优化,如在动态查询中结果列、条 件部分、排序列,分组列中没有出现参与查询的表,该动态查询对其级联 关系取消;条件谓词中出现IN,且其中值为具体的值而非嵌套的子查 询,该动态查询把IN部分优化成临时表,生成的SQL语句与之关联。

条件谓词IN部分优化成临时表脚本示例:

declareTableVar1286728257Table(cUser_Id nvarchar(MAX));

declareTableVar72919503Table(cUser_Name nvarchar(MAX));

insert intoTableVar1286728257values('00001');

insert intoTableVar1286728257values('00002');

insert intoTableVar72919503values('王铭');

insert intoTableVar72919503values('冯建国');

insert intoTableVar72919503values('杜军');

SELECT  BE_user_zy_ua_user.cSysUserPassword    AS [cSysUserPassword],

BE_user_zy_ua_user.cUserHand AS[cUserHand],

BE_user_zy_ua_user.cSysUserName AS[cSysUserName]

FROM  zy_ua_user AS BE_user_zy_ua_user

INNER JOIN TableVar1286728257AS TableVar1286728257

ON    TableVar1286728257.cUser_Id    = BE_user_zy_ua_user.cUser_Id

INNER JOIN  TableVar72919503AS TableVar72919503

ON    TableVar72919503.cUser_Name    = BE_user_zy_ua_user.cUser_Name

WHERE(1=1)

本方面技术方案的优点:

通过本发明的技术方案,在程序运行前期无需预置查询方案,动态查 询完全基于基础的实体和业务对象元素运行,在软件开发过程中,软件开 发人员无需显示调用系统方法,只要遵从集成查询标准规范即可动态解析 成SQL语句。

因此,该发明方案的运用,在应用上具有以下优势:

1、无需复杂学习过程即可上手。

2、编写更少代码即可创建完整应用。

3、更快开发错误更少的应用程序。

4、无需求助奇怪的编程技巧就可合并数据源。

5、让新开发者开发效率更高。

该发明应用到软件开发中,可以使得分模块、分层次、大规模开发更 高效和便捷。上层业务开发人员,无需关注数据的获取过程(拼接SQL, 执行SQL),可以简单地获取业务所需要的数据而且可灵活多变。

使用本发明提供的方法和系统,可以为各种应用场景提供动态查询, 包括:实体的动态查询,业务对象的动态查询,参照、列表、报表按照用 户动态设置的方案查询等。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于 本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精 神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明 的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号